読者です 読者をやめる 読者になる 読者になる

事務屋さんの備忘録

主にプログラミングのことを書いていきます。メモというか備忘録的な感じで。プログラミングといっても、私はプロのエンジニアでも本職のプログラマーでもありません。単なる事務職をやってるサラリーマンで、空いた時間にちょこちょこっとプログラミングしてる程度です。よってこのブログに記載したことが誤っていたり、もっとよい方法がある場合もあると思います。その場合には、ご指摘いただけると嬉しいです。また、このブログを読んで役に立った、なんて方がいらっしゃったら幸いですね。

AsyncTaskLoaderでJsonをパースする

Android

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();
	}

}