2011年7月1日金曜日

Android JSONObjectとかJSONArrayとか

半年ぐらい前に作ったAndroidアプリを最近見てみたら、データ取得に失敗していた。
よく見てみると、JSONデータ取得でExceptionになっていた。

アプリとしてはWebAPIをたたいてそこから帰ってくるJSONデータを加工してListViewに表示するもの。そのListViewに表示する際のJSON形式がいつのまにやら変わっていたのが原因っぽい。(連絡してよ~)

で、修正しようと思ったけど久々にAndroid触ったこともあって、手間取ったので一応まとめておく。


◆JSONObject
  JSONデータを扱うためのクラス。コンストラクタにJSONデータを渡すことで、
  getJsonString()等のメソッドでデータを取得できる。


◆JSONArray
  JSONデータのArray形式のデータを取得できるクラス。コンストラクタにJSONのArray形式の
  データを渡すことで、getJSONObject()等のメソッドでJSONObjectクラスを取得しそこから
  データを取得していく。

■変更前
今までは、JSONArrayでデータを渡すことでデータを取得できていた。

<データ形式>

  [{"key":"01","name":"sakura"},{"key":"01","name":"sakura"}]

<ソース>

	
    JSONArray coupon = new JSONArray(data);
    int len = coupon.length();
    for(i=0;i<=len;i++){
      JSONObject jCoupon = coupon.getJSONObject(i);
      ResponseDataCoupon rd = new ResponseDataCoupon(jCoupon);
      ListItem tmpItem = new ListItem(rd);
      list.add(tmpItem);
    }
しかし、形式が変わったため、以下のように一旦JSONObectからkey値を取得し、それからその キー値でgetJSONObjectを指定することでJSONデータの各レコードを取得するように変更した。 ■変更後 <データ形式>
  {"1":{"key":"01","name":"sakura"},"2":{"key":"01","name":"sakura"}} <ソース>
    JSONObject obj = new JSONObject(data);
    Iterator it = obj.keys();
    while(it.hasNext()){
      JSONObject jCoupon = obj.getJSONObject((String)it.next());
      ResponseDataCoupon rd = new ResponseDataCoupon(jCoupon);
      ListItem tmpItem = new ListItem(rd);
      list.add(tmpItem);
    }

ふー。そろそろAndroid再開じゃ。

0 件のコメント:

試験結果

昨日の夜、CGーArtsエンジニアのベーシック、エキスパートの自己採点をした。 実は日曜日には回答が出ていたけど、自信がなく採点するのもやめようかと思っていたがタイミング&勢いでやってしまった。 <結果>  ベーシック:85点  エキスパート:72.5点 70点以上で合格なので...