JSONデータの扱い方/Web APIの利用
(ブログ記事の一覧は「こちら」)
JSON(JavaScript Object Notation)とは、データを定義するためのフォーマットの1つです。同じような考えのフォーマットとして他にはXMLやCSVがあります。
最近では、Web APIの実行結果でよく使われるフォーマットとしては、JSONが多く見られます。
JSONは、その名前の通りJavaScriptでデータをパース(解析)するのに適していますが、Androidでも容易にパースするための関数が用意されていますので、その方法を学びましょう。
ここで学ぶこと
例題
作成するもの
「アプリ内のテキストファイルの読み込み」で説明した内容をこちらでも行います。アプリ内のrawフォルダにJSONファイルを置き、JSONデータを読み込む方法で例題を取り組んでいきましょう。
準備
まず、rawフォルダのJSONファイルを読み込み、String型のデータとしてプログラム内で持つ状態までを用意します。
private void readJsonText(int iRawFileName) { InputStream is = null; BufferedReader br = null; try { is = getResources().openRawResource(iRawFileName); br = new BufferedReader(new InputStreamReader(is)); String strSentence = null; StringBuilder sbSentence = new StringBuilder(); while ((strSentence = br.readLine()) != null) { sbSentence.append(strSentence); } br.close(); parseJson(sbSentence.toString()); } catch (IOException e) { e.printStackTrace(); } } private void parseJson(String strJsonData) { try { // JSONをパース(解析) // (後ほど説明するプログラムをここに記述します) } catch (JSONException e) { e.printStackTrace(); } }
onCreate関数で readJsonText関数を呼び出してください。JSONファイル名が「sample_json1.txt」の場合、引数には「R.raw.sample_json1」と入力します。
読み込みに成功すると、parseJson関数が呼び出されます。
以降は、様々なJSONファイルの例を見ていきましょう。
例1
以下のJSONデータをパース(解析)します。シンプルな例です。
ファイル名を「sample_json1.txt」で作成して、rawフォルダに保存してください。
{ "user" : { "id" : "A1234567", "name" : "Taro Yamada" } }
プログラム
以下の処理で、JSONデータを取得することができます。
JSONObject jsonObj = new JSONObject(strJsonData); JSONObject item = jsonObj.getJSONObject("user"); String strValue1 = item.getString("id"); String strValue2 = item.getString("name"); Log.v(TAG, strValue1 + " " + strValue2);
実行、確認
Logcatに「A1234567 Taro Yamada」と表示されることを確認してください。
例2
以下のJSONデータをパース(解析)します。レイヤーが1つ増えた例です。
ファイル名を「sample_json2.txt」で作成して、rawフォルダに保存してください。
{ "user" : { "info" : { "id" : "A1234567", "name" : "Taro Yamada" } } }
プログラム
以下の処理で、JSONデータを取得することができます。
JSONObject jsonObj = new JSONObject(strJsonData); JSONObject item = jsonObj.getJSONObject("user").getJSONObject("info"); String strValue1 = item.getString("id"); String strValue2 = item.getString("name"); Log.v(TAG, strValue1 + " " + strValue2);
実行、確認
Logcatに「A1234567 Taro Yamada」と表示されることを確認してください。
例3
以下のJSONデータをパース(解析)します。配列を含む例です。
ファイル名を「sample_json3.txt」で作成して、rawフォルダに保存してください。
{ "users" : [ { "id" : "A1234567", "name" : "Taro Yamada" }, { "id" : "B1234567", "name" : "Jiro Tanaka" }, { "id" : "C1234567", "name" : "Ichiro Suzuki" } ] }
プログラム
以下の処理で、JSONデータを全て取得することができます。
JSONObject jsonObj = new JSONObject(strJsonData); JSONArray items = jsonObj.getJSONArray("users"); for (int i = 0; i < items.length(); i++) { JSONObject item = items.getJSONObject(i); String strValue1 = item.getString("id"); String strValue2 = item.getString("name"); Log.v(TAG, strValue1 + " " + strValue2); }
実行、確認
Logcatに以下の結果が表示されることを確認してください。
A1234567 Taro Yamada
B1234567 Jiro Tanaka
C1234567 Ichiro Suzuki
課題1
例3のJSONデータについて、パース(解析)を行い、ListViewに表示してください。
(ListView表示) -------------------------------- A1234567 Taro Yamada -------------------------------- B1234567 Jiro Tanaka -------------------------------- C1234567 Ichiro Suzuki --------------------------------
[ヒント]
リスト表示(ListView)の例題2を参考にすると、比較的容易にできると思います。
課題2
Web APIの例として、天気予報API「OpenWeatherMap API」を試してみましょう。
準備
まずはOpenWeatherMap のサイトにアクセスして、右上の「Sign Up」からユーザー登録を行ってください。(無料)
登録が完了すると、APIを利用するための「App ID」が作成されます。
例えば、以下のURLにアクセスすると、現在の東京の天気情報を受け取ることができます。(最後の xxxx ... の部分は、登録時に取得した「App ID」を入力します。)
https://api.openweathermap.org/data/2.5/weather?q=Tokyo&appid=xxxxxxxxxxxxxxxxxxxxxxxx
つまり、Web APIとは、HTTPを通して目的の結果を得ることのできるインターフェースと言えます。
問題
非同期処理、HTTP通信の方法を用いて、上記のURLにアクセスして、まずはJSONデータ全体を取得してTextViewに表示してください。
次に、JSONデータのパースを行い、「現在の天気」「気温」「湿度」の結果だけを取り出すプログラムを作成してください。
現在の天気情報についての詳細は、こちらを参照してください。