
JavaでJsonを読み込む方法を簡単に解説します。
➊Jsonを読み込む方法
➋GSONライブラリの使い方
➌Jacksonライブラリの使い方
➍json-simpleライブラリの使い方
➎Jsonファイルの読み込み方法
今回は3つのライブラリを使って解説していきます。
この3つの中で最も簡単にコードを書けるものは何なのかを見ていきましょう。
一般的に、JavaでJsonを読み込むにはライブラリを使う必要があります。
今回は、以下3つのライブラリを使用した方法を解説します。
・GSONライブラリ
・Jacksonライブラリ
・json-simpleライブラリ
読み込むJsonサンプルは以下です。
{
"id": "test01",
"users": [
{
"name": "Bob",
"age": 40,
"cars": [
"Ford",
"BMW"
]
},
{
"name": "John",
"age": 30,
"cars": [
"Toyota",
"Nissan",
"Benz"
]
}
]
}
それでは解説していきます。
GSONはJavaでJsonを読み込むためにGoogleが開発したライブラリです。使用するためには、以下のライブラリをインポートしてください。
gradlecompile 'com.google.code.gson:gson:2.8.5'
Maven
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.5</version>
</dependency>
Jsonの読み込みでは、モデルクラスにJsonの値を詰め込んでから値を取り出す方法がわかりやすいです。
そのため、まずモデルクラスのサンプルを載せた後に、GSONを使ったソースコードを紹介します。
以下がJsonを格納するモデルクラスです。今回使用するJsonの一番上の階層の要素「id」と「users」(ユーザが複数)を格納できるようにモデルを作成します。
TestModel.javaimport java.util.List;
public class TestModel {
public String id;
public List<User> users;
}
次は、ユーザの情報を格納するクラスです。carsは複数設定されるため、リストにしています。
import java.util.List;
public class User {
public String name;
public Integer age;
public List<String> cars;
}
定義したクラスを使用して、GSONでJsonを読み込みます。以下サンプルです。
import com.google.gson.Gson;
public class GsonSample {
public static void main(String[] args) {
// サンプルのJson
String json =
"{" +
"\"id\": \"test01\"," +
"\"users\": [" +
"{" +
"\"name\": \"Bob\"," +
"\"age\": 40," +
"\"cars\": [" +
"\"Ford\"," +
"\"BMW\"" +
"]" +
"}," +
"{" +
"\"name\": \"John\"," +
"\"age\": 30," +
"\"cars\": [" +
"\"Toyota\"," +
"\"Nissan\"," +
"\"Benz\"" +
"]" +
"}" +
"]" +
"}";
// GSONを使用
Gson gson = new Gson();
// Jsonを読み込んで、modelクラスに格納する
TestModel model = gson.fromJson(json, TestModel.class);
// モデルクラスから各要素を取り出す。
System.out.println("id:" + model.id);
// Jsonのユーザ数文ループして値を取り出す
for (int i=0; i < model.users.size(); i++) {
// ユーザ情報取得
User user = model.users.get(i);
System.out.println((i + 1) + "番目のユーザ");
System.out.println(" name: " + user.name);
System.out.println(" age: " + user.age);
System.out.println(" cars:");
// jsonの車の数分ループ
user.cars.forEach(car -> {
System.out.println(" car: " + car);
});
}
}
}
Gsonのインスタンスを生成して、「fromJson」メソッドを呼び出せばOKです。
第一引数にjsonを、第二引数にモデルクラスを指定することで、Jsonの中身をモデルクラスに格納できます。
実行結果が以下です。
id:test01
1番目のユーザ
name: Bob
age: 40
cars:
car: Ford
car: BMW
2番目のユーザ
name: John
age: 30
cars:
car: Toyota
car: Nissan
car: Benz
Jsonの全項目が問題なく取得できることを確認できました。
JacksonはGSONと同様に、JavaでJsonを変換するライブラリの一つです。
gradle(build.gradle)compile 'com.fasterxml.jackson.core:jackson-databind:2.9.8'
Maven(pom.xml)
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.8</version>
</dependency>
Jacksonを使用する方法も、GSONで紹介したモデルクラスと同じモノを使います。
以下Jacksonを使ったJson読み込みのソースコードです。
JacksonSample.javaimport java.io.IOException;
import com.fasterxml.jackson.databind.ObjectMapper;
public class JacksonSample {
public static void main(String[] args) throws IOException {
// GSONと同じJsonのため、記載省略
String json = "......";
// ObjectMapperを生成
ObjectMapper mapper = new ObjectMapper();
// Jsonを読み込んで、modelクラスに格納する
TestModel model = mapper.readValue(json, TestModel.class);
// 以降GSONと同じソース
// モデルクラスから各要素を取り出す。
System.out.println("id:" + model.id);
// Jsonのユーザ数文ループして値を取り出す
for (int i=0; i < model.users.size(); i++) {
// ユーザ情報取得
User user = model.users.get(i);
System.out.println((i + 1) + "番目のユーザ");
System.out.println(" name: " + user.name);
System.out.println(" age: " + user.age);
System.out.println(" cars:");
// jsonの車の数分ループ
user.cars.forEach(car -> {
System.out.println(" car: " + car);
});
}
}
}
ObjectMapperの「readValue」メソッドを呼び出すことで、GSONと全く同じことができます。また、この2行以外はGSONと全く同じソースになります。
「readValue」メソッドの第一引数にjson、第二引数にモデルを指定すればOKです。ここもGSONの「fromJson」メソッドと同様です。
出力部分のソースが同じなので、実行結果も変わりません。
json-simpleも他と同様、JavaでJsonを変換するライブラリの一つです。
gradle(build.gradle)implementation 'com.googlecode.json-simple:json-simple:1.1.1'
Maven(pom.xml)
<dependency>
<groupId>com.googlecode.json-simple</groupId>
<artifactId>json-simple</artifactId>
<version>1.1.1</version>
</dependency>
json-simpleでは他と同様にモデルクラスを使用してコードを実装する場合、
GSONかJacksonを使用することになるので、モデルクラスを使わない方法で説明します。
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;
public class JsonSimpleSample {
@SuppressWarnings("unchecked")
public static void main(String[] args) throws ParseException {
// GSONと同じJsonのため、記載省略
String json = "......";
JSONParser jsonParser = new JSONParser();
// jsonをパースする
JSONObject jsonObject = (JSONObject) jsonParser.parse(json);
// 各要素を出力。文字列として取りたい場合は以下のようにCastする
// 「(String)jsonObject.get("id")」)
Object id = jsonObject.get("id");
System.out.println(id);
// users要素を取得
JSONArray users = (JSONArray) jsonObject.get("users");
// user分ループ
users.forEach(user -> parseUserObject((JSONObject) user));
}
/**
* Jsonのユーザ情報から要素を取得して出力する
* @param user ユーザのJsonObject
*/
private static void parseUserObject(JSONObject user) {
// ユーザ名(name)を取得する
Object name = user.get("name");
System.out.println(" name: " + name);
// 年齢(age)を取得する
Object age = user.get("age");
System.out.println(" age: " + age);
// 車情報(cars)を取得する
JSONArray cars = (JSONArray) user.get("cars");
// Jsonのcar要素分ループ
System.out.println(" cars:");
for (int i = 0; i < cars.size(); i++) {
// 車を一つ一つ取得して出力
Object object = cars.get(i);
System.out.println(" car: " + object);
}
}
}
json-simpleを使用する方法は、JsonObjectから要素を取り出す際に、要素名を指定する必要があります。
これが少し面倒なのと、モデルを使えない分、ソースが他よりも長めになってしまうのがデメリットです。
出力結果は、他と同様です。(ここだけ「一番目のユーザ」とかは出していませんが)
2章のGSONのソースを少しだけ変えて説明します。FileReaderを使っていただければ簡単に実装できます。
test.jsonは、この説明で使っているjsonを書き込んだファイルです。
JsonFileReadSample.javaimport java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import com.google.gson.Gson;
public class JsonFileReadSample {
public static void main(String[] args) {
// ファイルリーダで読み込む
try (FileReader fileReader = new FileReader("/tmp/test.json")){
// GSONを使用
Gson gson = new Gson();
// Jsonを読み込んで、modelクラスに格納する
TestModel model = gson.fromJson(fileReader, TestModel.class);
// 以降GSONと同じのため省略
} catch (FileNotFoundException e) {
// ファイルが見つからない例外処理
} catch (IOException e) {
// ファイル操作例外処理
}
}
}
GSONを使ってJsonファイルを読み込むサンプルです。
FileReaderの引数に読み込みたいJsonファイルのパスを指定してファイルリーダを生成します。それをメソッドの第一引数にわたしてあげるだけです。
他のソースも同じようにFileReaderを使えば、Jsonを読み込めます。
JavaでJsonを読み込む方法を3つ紹介ご紹介しました。
3つの中で実際に使うなら「GSON」か「Jackson」だとソースがシンプルになるので良いと思います。
今後も業務で使いそうなJavaのサンプルソースを上げていければと思っていますので、よかったら他の記事も見てみて下さい。
ここまで読んで頂き、ありがとうございました!