JSONをパース(解析)する
|「XMLをパース(解析)する」、「DefaultHttpClientを使ってコンテンツを取得する」とWeb上のXMLコンテンツを取得してパースする方法を紹介しましたが、今回はJSONをパースする方法を紹介します。
AndroidでシンプルにJSONを扱うにはJSONObjectクラスとJSONArrayクラスを用いる方法があります。
今回はATND APIを使った例を紹介しますが、他にもTwitterなどJSONで結果を返すWebAPIが増えてきていると思います。
ATND APIでAndroidが含まれているものを検索して、そのタイトルを表示してみようと思います。
それでは続きで
データ取得
まずはデータの取得を行います。「DefaultHttpClientを使ってコンテンツを取得する」とほとんどソースは一緒です。
APIのURIは「Androidが含まれているものを検索。フォーマットがJSONで」という意味です。
ATND APIの詳細はATND API リファレンスを参照してください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | HttpClient httpClient = new DefaultHttpClient(); HttpGet request = new HttpGet(uri.toString()); HttpResponse httpResponse = null ; try { httpResponse = httpClient.execute(request); } catch (Exception e) { Log.d( "JSONSampleActivity" , "Error Execute" ); return ; } 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データ } catch (Exception e) { Log.d( "JSONSampleActivity" , "Error" ); } } else { Log.d( "JSONSampleActivity" , "Status" + status); return ; } |
JSONをパース(解析)する
JSONとして取得した結果をパースしましょう。まずはルートオブジェクトを取得します。
このルートオブジェクトから必要な要素まで辿って行くことになります。
1 | JSONObject rootObject = new JSONObject(data); |
ATND APIのリファレンスを見るとルートに下には
- results_returned
- results_start
- event
の要素があると書いてあります。今回はイベントのタイトルを表示したいのでルートオブジェクトからevent要素を得る必要があります。
ただし、event要素は配列ですのでJSONObjectではなくJSONArrayクラスで取得します。getJSONArrayメソッドで要素名を指定して取得します。要素名はeventsです。
1 | JSONArray eventArray = rootObject.getJSONArray( "events" ); |
次のその配列から1つずるJSONObjectを取り出して次はタイトルの要素を取得します。
配列でなければgetJSONObjectメソッドで取得します。
1 2 3 4 | for ( int i = 0 ; i < eventArray.length(); i++) { JSONObject jsonObject = eventArray.getJSONObject(i); Log.d( "JSONSampleActivity" , jsonObject.getString( "title" )); } |
これでログにタイトルが表示されます。