2022-05-30 2022-05-31

【Java】JSONの読み込み方法3選を簡単にご紹介【JSONファイルの読み込みも】

メイン画像

JavaでJsonを読み込む方法を簡単に解説します。

◎この記事でわかること

➊Jsonを読み込む方法

➋GSONライブラリの使い方

➌Jacksonライブラリの使い方

➍json-simpleライブラリの使い方

➎Jsonファイルの読み込み方法

今回は3つのライブラリを使って解説していきます。

この3つの中で最も簡単にコードを書けるものは何なのかを見ていきましょう。

1. JavaでJsonを読み込むには?

一般的に、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"
            ]
        }
    ]
}

それでは解説していきます。

2. GSONライブラリでJsonを読み込む

GSONはJavaでJsonを読み込むためにGoogleが開発したライブラリです。使用するためには、以下のライブラリをインポートしてください。

gradle
compile '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.java
import java.util.List;

public class TestModel {
    public String id;
    public List<User> users;
}

 
次は、ユーザの情報を格納するクラスです。carsは複数設定されるため、リストにしています。

User.java
import java.util.List;

public class User {
    public String name;
    public Integer age;
    public List<String> cars;
}

 
定義したクラスを使用して、GSONでJsonを読み込みます。以下サンプルです。

GsonSample.java
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の全項目が問題なく取得できることを確認できました。

3. Jacksonライブラリで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.java
import 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」メソッドと同様です。

出力部分のソースが同じなので、実行結果も変わりません。

4. json-simpleライブラリでJsonを読み込む

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を使用することになるので、モデルクラスを使わない方法で説明します。

JsonSimpleSample.java
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から要素を取り出す際に、要素名を指定する必要があります。

これが少し面倒なのと、モデルを使えない分、ソースが他よりも長めになってしまうのがデメリットです。

出力結果は、他と同様です。(ここだけ「一番目のユーザ」とかは出していませんが)

5. Jsonファイルを読み込む

2章のGSONのソースを少しだけ変えて説明します。FileReaderを使っていただければ簡単に実装できます。

test.jsonは、この説明で使っているjsonを書き込んだファイルです。

JsonFileReadSample.java
import 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を読み込めます。

6. まとめ

JavaでJsonを読み込む方法を3つ紹介ご紹介しました。
3つの中で実際に使うなら「GSON」か「Jackson」だとソースがシンプルになるので良いと思います。

今後も業務で使いそうなJavaのサンプルソースを上げていければと思っていますので、よかったら他の記事も見てみて下さい。

ここまで読んで頂き、ありがとうございました!

Scroll to Top