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

プログラミング
この記事は約4分で読めます。
スポンサーリンク

前提

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 を指定することによって、シリアライズのみ行うのか、デシリアライズのみ行うのかを柔軟に行うことが可能になります。

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

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

コメント

タイトルとURLをコピーしました