0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Jackson】JsonProperty.Accessでシリアライズ時またはデシリアライズ時のみプロパティを無視する

Posted at

やり方

例えばシリアライズ時だけ無視するプロパティを定義したい場合、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; }
}
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?