AsyncTaskLoaderでJsonをパースする
NHKのオープンデータ(Json形式 NHK番組表API)をAsyncTaskLoaderを使ってパースしたので、メモ。
Jsonデータは以下のような感じ。
1.{ 2. "list":{ 3. "g1":[ 4. { 5. "id" : "2015030919800", 6. "event_id" : "19800", 7. "start_time" : "2015-03-09T04:10:00+09:00", 8. "end_time" : "2015-03-09T04:15:00+09:00", 9. "area":{ 10. "id" : "130", 11. "name" : "東京" 12. }, 13. "service":{ 14. "id" : "g1", 15. "name" : "NHK総合1", 16. "logo_s":{ 17. "url" : "http://www.nhk.or.jp/common/img/media/gtv-100x50.png", 18. "width" : "100", 19. "height" : "50" 20. }, 21. "logo_m":{ 22. "url" : "http://www.nhk.or.jp/common/img/media/gtv-200x100.png", 23. "width" : "200", 24. "height" : "100" 25. }, 26. "logo_l":{ 27. "url" : "http://www.nhk.or.jp/common/img/media/gtv-200x200.png", 28. "width" : "200", 29. "height" : "200" 30. } 31. }, 32. "title" : "未解決事件・追跡プロジェクト「名古屋主婦殺人事件」", 33. "subtitle" : "社会に衝撃を与えた事件を検証するシリーズ「未解決事件」。", 34. "genres":[ 35. "0002", 36. "0008", 37. "0207" 38. ] 39. }, 40. { 41. "id" : "2015030920919", 42. "event_id" : "20919", 43. "start_time" : "2015-03-09T04:15:00+09:00", 44. "end_time" : "2015-03-09T04:20:00+09:00", 45. "area":{ 46. "id" : "130", 47. "name" : "東京" 48. }, 49. "service":{ 50. "id" : "g1", 51. "name" : "NHK総合1", 52. "logo_s":{ 53. "url" : "http://www.nhk.or.jp/common/img/media/gtv-100x50.png", 54. "width" : "100", 55. "height" : "50" 56. }, 57. "logo_m":{ 58. "url" : "http://www.nhk.or.jp/common/img/media/gtv-200x100.png", 59. "width" : "200", 60. "height" : "100" 61. }, 62. "logo_l":{ 63. "url" : "http://www.nhk.or.jp/common/img/media/gtv-200x200.png", 64. "width" : "200", 65. "height" : "200" 66. } 67. }, 68. "title" : "シリーズ世界遺産100「ペルシャ式庭園~イラン~」", 69. "subtitle" : "「水が創るパラダイス」▽文化遺産▽乾燥した大地に造られた庭園。地下水路で水を引き込み、土地の傾斜と水圧を利用した庭園内で水が流れるさまは、楽園を思わせる。", 70. "genres":[ 71. "0801", 72. "0804", 73. "0802" 74. ] 75. }, 76.
上記をパースする方法。単にパースした結果をTextViewに書き出しただけ。
AsyncTaskでも実装できるが、AsyncTaskLoaderの方が好き。
MainActivity.java
package com.frefly3104.jsonparsenhk; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Locale; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import android.app.Activity; import android.app.LoaderManager.LoaderCallbacks; import android.content.Loader; import android.os.Bundle; import android.util.Log; import android.widget.TextView; public class MainActivity extends Activity implements LoaderCallbacks<JSONObject>{ private static final String URLTEXT = "http://api.nhk.or.jp/v1/pg/list/130/g1/"; private static final String APIKEY = ".json?key=XXXXXXXXXXXXXXXXXXXXXXXXXXXXX"; private static final int ADDRESSLOADER_ID = 0; private TextView textView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); textView = (TextView) findViewById(R.id.textView1); getLoaderManager().restartLoader(ADDRESSLOADER_ID, null, this); } @Override public Loader<JSONObject> onCreateLoader(int id, Bundle args) { // TODO 自動生成されたメソッド・スタブ // 当日日付を取得 Date nowDate = new Date(); // yyyy-MM-dd形式へ String strDate = new SimpleDateFormat("yyyy-MM-dd",Locale.US).format(nowDate); String url = URLTEXT + strDate + APIKEY; return new JsonLoader(this, url); } @Override public void onLoadFinished(Loader<JSONObject> loader, JSONObject data) { // TODO 自動生成されたメソッド・スタブ if (data != null) { try { JSONObject jsonObject = data.getJSONObject("list"); JSONArray jsDataList = jsonObject.getJSONArray("g1"); for (int i = 0; i < jsDataList.length(); i++) { JSONObject jsData = jsDataList.getJSONObject(i); String start_time = jsData.getString("start_time"); String end_time = jsData.getString("end_time"); String title = jsData.getString("title"); String subtitle = jsData.getString("subtitle"); String text = start_time + "\n" + end_time + "\n" + title + "\n" + subtitle + "\n"; textView.append(text); } } catch (JSONException e) { Log.d("onLoadFinished","JSONのパースに失敗しました。 JSONException=" + e); } }else{ Log.d("onLoadFinished", "onLoadFinished error!"); } } @Override public void onLoaderReset(Loader<JSONObject> loader) { // TODO 自動生成されたメソッド・スタブ } }
JsonLoader.java
package com.frefly3104.jsonparsenhk; import java.io.ByteArrayOutputStream; import org.apache.http.HttpResponse; import org.apache.http.HttpStatus; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.DefaultHttpClient; import org.json.JSONObject; import android.content.AsyncTaskLoader; import android.content.Context; import android.util.Log; public class JsonLoader extends AsyncTaskLoader<JSONObject> { private String urlText; public JsonLoader(Context context,String urlText) { super(context); // TODO 自動生成されたコンストラクター・スタブ this.urlText = urlText; } @Override public JSONObject loadInBackground() { // TODO 自動生成されたメソッド・スタブ HttpClient httpClient = new DefaultHttpClient(); StringBuilder uri = new StringBuilder(urlText); HttpGet request = new HttpGet(uri.toString()); HttpResponse httpResponse = null; try { httpResponse = httpClient.execute(request); } catch (Exception e) { Log.d("JsonLoader", "Error Execute"); return null; } int status = httpResponse.getStatusLine().getStatusCode(); if (HttpStatus.SC_OK == status) { try { ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); httpResponse.getEntity().writeTo(outputStream); String data; data = outputStream.toString(); // JSONデータ JSONObject rootObject = new JSONObject(data); return rootObject; } catch (Exception e) { Log.d("JsonLoader", "Error"); } } else { Log.d("JsonLoader", "Status" + status); return null; } return null; } @Override protected void onStartLoading() { // TODO 自動生成されたメソッド・スタブ forceLoad(); } }