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);