在开发接口时,出于某些目的(比如有些字段我要设置默认值,不能受入参的影响),我们在入参字符串序列化成实体时,可能需要忽略某些属性。
我们要达到的目的非常简单,一个用户类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
失效的问题,最终也没找到答案,有知道的童鞋不妨留言说明一下。
评论 (0)