目录
前言
这篇博客主要记录一下最近boot项目的Jackson反序列化遇到的问题,Java 属性名 和 JSON 字段名 相同,知识因为属性名大写,导致反序列失败的原因以及解决方案
案例
-
JSON数据
{"Status":"Fail", "ErrorURL":"xxx"} -
Java实体
java@Data @JsonIgnoreProperties(ignoreUnknown = true) public class DorisResponse { private String Status; // 首字母大写 private String ErrorURL; // 首字母大写 } -
反序列化后 Status 和 ErrorURL 均为 null
Jackson反序列失败原因
@Data注解会遵循 Java Bean 规范生成 setter 方法,成员变量 Status → 生成 setStatus(String status),成员变量 ErrorURL → 生成 setErrorURL(String errorURL)- Jackson在反序列化时,首先会通过反射获取 类 的所有setter 方法,然后去掉 set ,剩下的名称首字母小写,所以上面这个类 在Jackson推导后,得到的是 status 和 errorURL,这两个名称跟 原始JSON的字段都对应不上,因此反序列失败
解决方案
-
直接在属性上 添加注解 @JsonProperty 强制绑定属性和JSON字段即可
java@Data @JsonIgnoreProperties(ignoreUnknown = true) public class DorisResponse { @JsonProperty("Status") private String status; @JsonProperty("ErrorURL") private String errorURL; } -
@JsonProperty是强制绑定标记,它会覆盖 Jackson 所有默认的属性名推导和命名匹配规则 -
Jackson在扫描 类 的所有属性 时 发现
@JsonProperty注解,然后将类的属性名 和 注解属性 关联在一起,然后 通过 属性名 首字母 大写 前面加 set 找到该属性的 setter 方法,最后通过 反射的 invoke方法,就将 JSON 字段注入到对象属性中