JSONデータの読み取り(Java)

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

JSONJavaScript Object Notation)とは、データを定義するためのフォーマットの1つです。同じような考えのフォーマットとしてXMLCSVがあります。最近では、Web APIの実行結果でよく使われるフォーマットとしてJSONが多く見られます。

JSONは、その名前の通りJavaScriptでデータをパース(解析)するのに適していますが、他のプログラム言語でもパースするためのメソッドは用意されています。Javaでは外部ライブラリを使用することでパースが可能です。(Androidではパースするための関数が最初から用意されています)

ここでは、JavaJSONデータをパースする方法を学びましょう。

JSONデータが書かれたテキストファイルを用意して、テキストファイルからJSONデータを読み込むサンプルを作成します。

テキストファイルの読み込み

まず準備として、テキストファイルからテキストデータを読み込むプログラムを作成します。

以下のテキストデータが入力されたファイル「json_test.txt」を作成して(文字コードUTF-8で保存)、作成したプロジェクトフォルダ(「.project」ファイルがある場所)にコピーします。

{
    "user" : {
        "id" : "A1234567",
        "name" : "Taro Yamada"
    }
}

ちなみに、上記はシンプルなJSONデータのサンプルになります。
キー"id"に対する値は "A1234567"、という関係になります。


テキストファイル「json_test.txt」を読み込み、コンソールに出力するサンプルプログラムです。

   String strFileName = "json_test.txt";
    
    FileReader fr = null;
    BufferedReader br = null;
    try{
        // ファイル読み込み
        File file = new File(strFileName);
        fr = new FileReader(file);
        br = new BufferedReader(fr);

        // テキストを取得
        String strLine;
        StringBuilder sbSentence = new StringBuilder();
        while ((strLine = br.readLine()) != null) {
            sbSentence.append(strLine);
        }
        
        // JSONデータ(後で、この部分を修正する)
        System.out.println(sbSentence.toString());
        
    } catch (FileNotFoundException e) {
        System.out.println(e);
    } catch (IOException e) {
        System.out.println(e);
    } finally {
        try {
            if (br != null) {
                br.close();
            }
            if (fr != null) {
                fr.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

JSONデータ形式を含む全ての文字列が取得できたことを確認してください。
次に、JSONデータをパースするプログラムに書き換える方法について確認しましょう。

JSONライブラリの登録

以下のリンクからJSONライブラリを取得します。
https://mvnrepository.com/artifact/org.json/json
リストの「Version」欄から最新のものをクリックします。移動したページで、表の「Files」にある「bundle」をクリックすると、「json-xxxxxxxx.jar」がダウンロードされます。

次に、下図のように、プロジェクト名を右クリックして、「ビルド・パス」→「外部アーカイブの追加」を選択して、「json-xxxxxxxx.jar」を登録します。

f:id:MJeeeey:20200713212359p:plain:w480

下図のように追加されたことを確認してください。

f:id:MJeeeey:20200713212434p:plain:w240

これで準備ができました。

JSONデータの読み込み

例1

先ほどの「json_test.txt」のJSONデータについて、各キーの値を取得するためのプログラムです。先ほどのテキストファイルの読み込みのサンプルに追記します。

   // JSONオブジェクトのインスタンス作成
    JSONObject jsonObj = new JSONObject(sbSentence.toString());
    // キー"user"の値(JSONオブジェクト)をパース
    JSONObject item = jsonObj.getJSONObject("user");
    // 各キーの値を出力
    System.out.println(item.get("id"));
    System.out.println(item.get("name"));

以下のimport文が必要になります。(自動で追加されます)

import org.json.JSONObject;

例2

次に、配列を含むJSONデータについても試してみます。 以下のJSONデータを「json_test2.txt」としてファイルに保存して、プロジェクトフォルダに追加してください。

{
    "users" : [
        {
            "id" : "A1234567",
            "name" : "Taro Yamada"
        },
        {
            "id" : "B1234567",
            "name" : "Jiro Tanaka"
        },
        {
            "id" : "C1234567",
            "name" : "Ichiro Suzuki"
        }
    ]
}

各キーの値を取得するためのプログラムです。例1の部分から書き換えます。

   // JSONオブジェクトのインスタンス作成
    JSONObject jsonObj = new JSONObject(sbSentence.toString());
    // キー"users"の値(JSON配列オブジェクト)をパース
    JSONArray items = jsonObj.getJSONArray("users");
    for (int i = 0; i < items.length(); i++) {
        // JSONオブジェクトをパース
        JSONObject item = items.getJSONObject(i);
        // 各キーの値を出力
        System.out.println(item.get("id"));
        System.out.println(item.get("name"));
    }

以下のimport文が必要になります。(自動で追加されます)

import org.json.JSONArray;

課題

以下のJSONデータについて、キー"id", "name"の各値を出力するプログラムを作成してください。

{
    "user" : {
        "info" : {
            "id" : "A1234567",
            "name" : "Taro Yamada"
        }
    }
}