読者です 読者をやめる 読者になる 読者になる

【Java】Gsonの使い方

Java
スポンサーリンク

Java で JSON を扱うためのライブラリである Gson の使い方です。同様のライブラリとしては以前紹介した  JSONIC や Jackson があります。

Maven repository

Maven や Gradle には以下を追加して下さい。

<dependencies>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.3.1</version>
    <scope>compile</scope>
</dependencies>
compile 'com.google.code.gson:gson:2.3.1'

 google/gson · GitHub
 Gson User Guide - gson

Gsonの使い方

Gson は Java のオブジェクトを JSON 形式に変換・復元するためのライブラリーなので、ドキュメントではそれぞれシリアライズ・デシリアライズと記述されています。Java で Serializable というとオブジェクトを読み書きできる形に整形することを表していますね。使用するメソッドは基本的にシリアライズのtoJson()とデシリアライズのfromJson()の2つだけです。

基本データ型、リスト、マップからJSONへの変換

Gson gson = new Gson();  // Gsonのインスタンス化
System.out.println(gson.toJson("hoge"));  // "hoge"
System.out.println(gson.toJson(12345));  // 12345
System.out.println(gson.toJson(true));  // true
System.out.println(gson.toJson(null));  // null
System.out.println(gson.toJson(Arrays.asList("hoge", "fuga")));  // ["hoge","fuga"]
Map<String, Object> map = new HashMap<>();
map.put("one", 12345);
System.out.println(gson.toJson(map1));  // {"one":12345}

JSONから基本データ型、配列、マップへの変換

Gson gson = new Gson();  // Gsonのインスタンス化
String str = gson.fromJson("\"hoge\"", String.class);
int num = gson.fromJson("12345", int.class);
boolean boo = gson.fromJson("false", Boolean.class);
String none = gson.fromJson("null", String.class);
List list = gson.fromJson("[\"hoge\",\"fuga\"]", List.class);
Map map = gson.fromJson("{\"one\":12345}", Map.class);

Javaオブジェクトの変換

次の Person クラスを元に JSON へのシリアライズ・デシリアライズを確認します。デフォルトではスーパークラスも含めた全てのフィールドが変換されますが Setter と Getter は必要ありません。transient修飾子を付けることでシリアライズ・デシリアライズの対象から外すことができます。

public class Person {
    private int id;
    private String name;

    public Person(int id, String name) {
        this.id = id;
        this.name = name;
    }
}
// シリアライズ
Person person = new Person(100, "Michel");
System.out.println(gson.toJson(person));

//=> Result
{"id":100,"name":"Michel"}

// デシリアライズ
Person deperson = gson.fromJson("{\"id\":100,\"name\":\"Michel\"}", Person.class);

nullのフィールドが存在する場合

シリアライズ時に null のフィールドが存在する場合、デフォルトでは JSON に出力されません。

Map<String, Object> map = new HashMap<>();
map.put("one", "hoge");
map.put("two", null);
map.put("three", false);
System.out.println(gson.toJson(map));

//=> Result
{"one":"hoge","three":false}

Person person = new Person(100, null);
System.out.println(gson.toJson(person));

//=> Result
{"id":100}

null のフィールドも出力したい場合は次のように Gson インスタンスを生成します。

Gson gson = new GsonBuilder().serializeNulls().create();

System.out.println(gson.toJson(map));
//=> Result
{"one":"hoge","two":null,"three":false}


System.out.println(gson.toJson(person));
//=> Result
{"id":100,"name":null}

デシリアライズ時に JSON の値が null となっていた場合、または対応するフィールドが存在しなかった場合は null となり、KEY のみが存在する場合は Exception が発生します。

// Person の name フィールドが null になる
Person deperson = gson.fromJson("{\"id\":100,\"name\":null}", Person.class);
Person deperson = gson.fromJson("{\"id\":100}", Person.class);

// JsonSyntaxException が発生
Person deperson = gson.fromJson("{\"id\":100,\"name\":}", Person.class);