JSONデータの扱い方/Web APIの利用

(ブログ記事の一覧は「こちら」)

JSONJavaScript Object Notation)とは、データを定義するためのフォーマットの1つです。同じような考えのフォーマットとして他にはXMLCSVがあります。
最近では、Web APIの実行結果でよく使われるフォーマットとしては、JSONが多く見られます。
JSONは、その名前の通りJavaScriptでデータをパース(解析)するのに適していますが、Androidでも容易にパースするための関数が用意されていますので、その方法を学びましょう。

ここで学ぶこと

  • JSON
  • JSONデータの取得(JSONObject)
  • 配列データの取得(JSONArray)
  • Web APIの利用

例題

作成するもの

アプリ内のテキストファイルの読み込み」で説明した内容をこちらでも行います。アプリ内の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データのパースを行い、「現在の天気」「気温」「湿度」の結果だけを取り出すプログラムを作成してください。

現在の天気情報についての詳細は、こちらを参照してください。