JSONデータの読み取り(Java)
(ブログ記事の一覧は「こちら」)
JSON(JavaScript Object Notation)とは、データを定義するためのフォーマットの1つです。同じような考えのフォーマットとしてXMLやCSVがあります。最近では、Web APIの実行結果でよく使われるフォーマットとしてJSONが多く見られます。
JSONは、その名前の通りJavaScriptでデータをパース(解析)するのに適していますが、他のプログラム言語でもパースするためのメソッドは用意されています。Javaでは外部ライブラリを使用することでパースが可能です。(Androidではパースするための関数が最初から用意されています)
ここでは、JavaでJSONデータをパースする方法を学びましょう。
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」を登録します。
下図のように追加されたことを確認してください。
これで準備ができました。
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" } } }