Jackson ObjectMapper Json <-> Java オブジェクト変換の使い方

2021-08-16Java

Jackson ObjectMapper を使って、Java オブジェクトと Json を変換する方法。REST API 開発の際に、コントローラのユニットテストでよく使ったのでメモ。

用語も忘れるのでメモしておく。

シリアライズ ( serialize ) : Java オブジェクト -> Json に変換
デシリアライズ ( deserialize ) : Json -> Java オブジェクトに変換

使用するデータ

サンプルで使う Java オブジェクト

public class Hoge {

    private int id;
    private String type;

    // Getter & Setter 
}

フィールドが public なら、Getter と Setter がなくても変換可能。public 以外なら、Getter と Setter がいる。

Java オブジェクト -> Json 文字列

ObjectMapper objectMapper = new ObjectMapper();
Hoge hoge = new Hoge(99, "type1");
String jsonAsString = objectMapper.writeValueAsString(hoge);

Output

{"id":99,"type":"type1"}

Json -> Java オブジェクト

ObjectMapper objectMapper = new ObjectMapper();
Hoge hoge = objectMapper.readValue(json, Hoge.class);

Java オブジェクト -> Json ファイル出力

変換結果をファイル出力できる。

ObjectMapper objectMapper = new ObjectMapper();
Hoge hoge = new Hoge(99, "type1");
objectMapper.writeValue(new File("../hoge.json"), hoge);

Json ファイル -> Java オブジェクト

Json をファイルから読み込むことができる。

ObjectMapper objectMapper = new ObjectMapper();
Hoge hoge = objectMapper.readValue(new File("../../hoge.json"), Hoge.class);

Json -> Java オブジェクトの List

List などにデシリアライズする場合は、TypeReference を使う。

String json = "[{ \"id\" : 99, \"type\" : \"type1\" }, { \"id\" : 100, \"type\" : \"type2\" }]";
ObjectMapper objectMapper = new ObjectMapper();
List<Hoge> list = objectMapper.readValue(json, new TypeReference<List<Hoge>>() {});

Json -> Java Map

TypeReference を使って、Map に変換する。

String json = "{ \"id\" : 99, \"type\" : \"type1\" }";
Map<String, Object> map 
  = objectMapper.readValue(json, new TypeReference<Map<String,Object>>(){});

シリアライズ時の Date フォーマット

シリアライズ時のデフォルト Date フォーマットはエポック秒。60484389 みたいな数字になる。

サンプルの Java オブジェクト。

public class HogeDate
{
    private Date someDate;

    //  Getter & Setter 
}

シリアライズ時にフォーマットする。

ObjectMapper objectMapper = new ObjectMapper();
DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm");
objectMapper.setDateFormat(df);
String json = objectMapper.writeValueAsString(hogeDate);

Output

{"someDate":"2021-08-01 10:00"}

Posted by Agopeanuts