やり方
例えばシリアライズ時だけ無視するプロパティを定義したい場合、JsonProperty.Access
を使って以下のようにできます。
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
public class DTO {
private String s;
@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
public String getS() { return s; }
public void setS(String s) { this.s = s; }
}
// デシリアライズ -> シリアライズする例
ObjectMapper mapper = new ObjectMapper().disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);
// デシリアライズ時は、正常に値がセットされている
DTO dto = mapper.readValue("{\"s\":\"v\"}", DTO.class);
System.out.println(dto.getS()); // -> v
// シリアライズ時は無視されている
System.out.println(mapper.writeValueAsString(dto)); // -> {}
デシリアライズ時だけ無視したい場合はJsonProperty.Access.READ_ONLY
を利用します。
文脈
Jackson
の処理で何らかのプロパティを無視したい場合、まず浮かぶのはJsonIgnore
でしょう。
一方、JsonIgnore
は細かな調整が効かず、付与先がゲッターであっても、デシリアライズ時に無視されてしまいます。
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
public class DTO {
private String s;
@JsonIgnore
public String getS() { return s; }
public void setS(String s) { this.s = s; }
}
// JsonIgnoreの付与先はgetterだが、デシリアライズ時も無視されてしまう
ObjectMapper mapper = new ObjectMapper();
DTO dto = mapper.readValue("{\"s\":\"v\"}", DTO.class);
System.out.println(dto.getS()); // -> null
「シリアライズ時は無視、デシリアライズ時は有効」としたい場合、冒頭で紹介した通り、JsonProperty.Access.WRITE_ONLY
が利用できます。
おまけ: ゲッターへREAD_ONLY
を付与するケース
基本的にデシリアライズ処理からゲッターへアクセスされることは有りませんが、コレクションに対する値のセット処理ではアクセスされることが有ります。
この時コレクションが編集不可だと、add
でエラーになります。
このようなケースについては、ゲッターへREAD_ONLY
を指定することで、エラーを回避できます。
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
import java.util.Arrays;
import java.util.List;
public class DTO {
private final String raw;
private final List<String> list;
@JsonCreator
public DTO(@JsonProperty("raw") String raw) {
this.raw = raw;
list = Arrays.asList(raw.split(","));// Arrays.asListはadd出来ないListを返す
}
public String getRaw() { return raw; }
// デシリアライズ時、JSON上にlistプロパティが有ると、ここから取得 -> addしてエラーになってしまう
@JsonProperty(access = JsonProperty.Access.READ_ONLY)
public List<String> getList() { return list; }
}