Jackson反序列化时忽略某些属性的方法

Jackson反序列化时忽略某些属性的方法

Laughing
2022-11-06 / 0 评论 / 1,490 阅读 / 正在检测是否收录...
温馨提示:
本文最后更新于2024年03月15日,已超过308天没有更新,若内容或图片失效,请留言反馈。

在开发接口时,出于某些目的(比如有些字段我要设置默认值,不能受入参的影响),我们在入参字符串序列化成实体时,可能需要忽略某些属性。

我们要达到的目的非常简单,一个用户类User.java,我们要达到的目的有两个:(1)控制序列化时,忽略name属性。(2)控制反序列化是,忽略name属性。

一、@JsonIgnore注解

当我们想控制是一个实体在序列化时,忽略某些属性,我们第一个想到的也许就是@JsonIgnore注解了,@JsonIgnore注解能控制实体在序列化时,忽略某些属性,但是无法控制实体在反序列化时忽略的属性。

先来看一下我们测试用的User.java类。

public class User implements Serializable {

    private String code;

    @JsonIgnore
    private String name;

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public String getName() {
        return name;
    }

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

1.1、序列化

我们先试一下序列化,看看name属性能否在序列化时自动忽略掉。

测试方法也非常简单

ObjectMapper objectMapper = new ObjectMapper();
User user = new User();
user.setCode("code123");
user.setName("name123");
System.out.println(objectMapper.writeValueAsString(user));

可以看到,name属性确实忽略了,也就是这个注解针对序列化是生效的。

1.2、反序列化

序列化时候没问题,那么反序列化时候是否也没问题呢,我们接着往下看。

String userStr = "{\"code\":\"code123\",\"name\":\"name123\"}";
User user1 = objectMapper.readValue(userStr, User.class);

这个时候我们不能在序列化输出显示了,我们调试看一下。

我们可以看到,也是能够正常忽略掉的。

但是,今天在项目开发时,我使用了同样的方法,发现@JsonIgnore注解没有起作用,但是实体类是这么样的

@Data
@NoArgsConstructor
public class User implements Serializable {

    private String code;

    @JsonProperty(value = "name")
    @JsonIgnore
    private String name;

    @JsonProperty(value = "billCateProp")
    @JsonIgnore
    @JSONField(deserialize  = false)
    private String billCateProp;

    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date date;

}

怀疑了Data注解,也怀疑了@JsonProperty@JsonIgnore注解冲突,甚至是属性Camel命名等,但是同样的代码,我拿到别的地方也有没有再现问题,所以终究也不知道是什么原因导致的。

2、@JsonProperty

@JsonIgnore的问题没有解决,只能另辟蹊径,最终发现@JsonIgnore注解有个access属性,通过access属性解决了问题,在反序列化时,不会再读取忽略的字段,遂将代码调整如下

    @JsonProperty(value = "billCateProp",access = JsonProperty.Access.READ_ONLY)
//    @JsonIgnore
    @JSONField(deserialize  = false)
    private String billCateProp;

JsonProperty.Access.READ_ONLY代表反序列化是忽略字段。

JsonProperty.Access.WRITE_ONLY代表序列化时忽略字段。

@JsonIgnore失效的问题,最终也没找到答案,有知道的童鞋不妨留言说明一下。

1

评论 (0)

取消