2018年7月11日水曜日

JacksonでイミュータブルなオブジェクトにJsonをマッピングする

com.fasterxml.jackson.annotation.JsonCreatorアノテーションを使うこと、コンストラクタかファクトリメソッドを使った構築ができる。

コンストラクタを使った場合

  • コンストラクタにJsonCreatorアノテーションを設定する。
  • 引数には、JsonPropertyアノテーションを設定し、Jsonのキー名を指定する。
public class Sample {

    public final String name;

    public final short age;

    @JsonCreator
    public Sample(
            @JsonProperty("name") final String name,
            @JsonProperty("age") final short age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Sample{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

ファクトリメソッドを使った場合

ファクトリメソッドの場合には、コンストラクタに設定していたアノテーションをファクトリメソッドにそのまま持ってくれば良い。
public class Sample {

    public final String name;

    public final short age;

    private Sample(final String name, final short age) {
        this.name = name;
        this.age = age;
    }

    @JsonCreator
    public static Sample create(
            @JsonProperty("name") final String name,
            @JsonProperty("age") final short age) {
        return new Sample(name, age);
    }

    @Override
    public String toString() {
        return "Sample{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

動作結果

動作確認に使ったコード
final ObjectMapper objectMapper = new ObjectMapper();
final Sample sample = objectMapper.readValue("{\"name\": \"なまえ\", \"age\": 100}", Sample.class);
System.out.println("sample = " + sample);

標準出力の結果
sample = Sample{name='なまえ', age=100}