前提
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 等のオブジェクトのプロパティにつけるアノテーションなので、オブジェクト目線なのでしょうね。
コメント