Android JSON パース 入れ子にハマる

{ } [ ] 要注意!

気付いてしまえば、なんてことはない。でも、↑を見間違えてパースできない(泣)。なんてことになったから φ(..)メモメモ

Android (Java) において JSON パースは、org.json.JSONObject を利用する場合

  • {"key": "value"} は、オブジェクトなので getJSONObject()
  • {"key": ["value"]} は、配列なので getJSONArray()

コレが基本。でも、入れ子(ネスト)がでてくると

{
 "key":"value",
 "items": [
  {
   "hoge":"hage",
   "itemInfo": {
    "title":"JSON"
   }
  }
 ]
}

こんな感じに。

title をゲットしようと思うと

// json は、上記 String 型のデータ
JSONObject jsonObject = new JSONObject(json);
String title = jsonObject.getJSONArray("items").getJSONObject(0).getJSONObject("itemInfo").getString("title")

てな文に。

“items” は配列で “itemInfo” はオブジェクトなのだが { }[ ] を見間違えると、メソッドがゴチャゴチャになりパースできない。 配列の値が一個のときは、ほんと要注意!

(T_T)

Android JsonReader

蛇足です。アンドロイドには、android.util.JsonReader なるクラスがあります。そいつを使って同様に title をゲットしようと思うと

// json は、インプットストリーム
JsonReader reader = new JsonReader(new InputStreamReader(json));

reader.beginObject();
while (reader.hasNext()) {
  String name = reader.nextName();
  if (name.equals("items")) {
    reader.beginArray();
    while (reader.hasNext()) {
      reader.beginObject();
      while (reader.hasNext()) {
        String itemName = reader.nextName();
        if (itemName.equals("itemInfo")) {
          reader.beginObject();
          while (reader.hasNext()) {
            String infoName = reader.nextName();
            if (infoName.equals("title")) {
              title = reader.nextString();
            } else {
              reader.skipValue();
            }
          }
          reader.endObject();
        } else {
          reader.skipValue();
        }
      }
      reader.endObject();
    }
    reader.endArray();
  } else {
    reader.skipValue();
  }
}
reader.endObject();
reader.close();

なっ、長っ!
コードが正しいかは、デバグしないとわからない構成(汗)。

そんなわけで HTTP 通信で JSON をゲットしたあと、特定のデータのみ利用するなら org.json.JSONObject を。全データをパースするようなら GSON などのライブラリを使うのがよろしいかと。

“Android JSON パース 入れ子にハマる” への1件の返信

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です