kz’s blog

興味のあることについて書いていきます。

Java で Json のシリアライズ・デシリアライズを柔軟に行う

前提

Json パーサライブラリは Jackson を使用しております。

Bean 定義

public class Bean {

    private int id;

    private String name;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        StringBuilder builder = new StringBuilder();
        builder.append("Bean [id=");
        builder.append(id);
        builder.append(", name=");
        builder.append(name);
        builder.append("]");
        return builder.toString();
    }
}

実行クラス定義

import com.fasterxml.jackson.databind.ObjectMapper;

public class Test {

    public static void main(String[] args) throws Exception {

        ObjectMapper om = new ObjectMapper();

        Bean bean = new Bean();
        bean.setId(1);
        bean.setName("太郎");

        // シリアライズ(オブジェクト → JSON)
        String serialized = om.writeValueAsString(bean);
        System.out.println(serialized);

        String json = "{\"id\":2,\"name\":\"次郎\"}";

        // デシリアライズ(JSON → オブジェクト)
        Bean deserialized = om.readValue(json, Bean.class);
        System.out.println(deserialized.toString());

    }

}

実行結果(デフォルトの状態)

{"id":1,"name":"太郎"}
Bean [id=2, name=次郎]

Bean 修正(READ_ONLY)

   @JsonProperty(access = Access.READ_ONLY)
    private String name;

nameプロパティにアノテーションを追加している。

実行結果(READ_ONLY)

{"id":1,"name":"太郎"}
Bean [id=2, name=null]

nameプロパティはシリアライズ時のみ反映されている。

Bean 修正(WRITE_ONLY)

   @JsonProperty(access = Access.WRITE_ONLY)
    private String name;

nameプロパティにアノテーションを修正している。

実行結果(WRITE_ONLY)

{"id":1}
Bean [id=2, name=次郎]

nameプロパティはデシリアライズ時のみ反映されている。

まとめ

プロパティに@JsonPropertyを指定することによって、シリアライズのみ行うのか、デシリアライズのみ行うのかを柔軟に行うことが可能になります。

それにしても、@JsonPropertyREAD_ONLYの時はObjectMapper#writeValueAsStringすることができて、@JsonPropertyWRITE_ONLYの時はObjectMapper#readValueすることができるので、ちょっと違和感がありますね。

まぁ、Bean 等のオブジェクトのプロパティにつけるアノテーションなので、オブジェクト目線なのでしょうね。