{ }
と[ ]
に要注意!
気付いてしまえば、なんてことはない。でも、↑を見間違えてパースできない(泣)。なんてことになったから φ(..)メモメモ
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 などのライブラリを使うのがよろしいかと。
コメントを残す