Jackson 反序列化首字母大写字段映射失败的底层原因与解决方案

目录

前言

这篇博客主要记录一下最近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反序列失败原因

  1. @Data 注解会遵循 Java Bean 规范生成 setter 方法,成员变量 Status → 生成 setStatus(String status),成员变量 ErrorURL → 生成 setErrorURL(String errorURL)
  2. Jackson在反序列化时,首先会通过反射获取 类 的所有setter 方法,然后去掉 set ,剩下的名称首字母小写,所以上面这个类 在Jackson推导后,得到的是 status 和 errorURL,这两个名称跟 原始JSON的字段都对应不上,因此反序列失败

解决方案

  1. 直接在属性上 添加注解 @JsonProperty 强制绑定属性和JSON字段即可

    java 复制代码
    @Data
    @JsonIgnoreProperties(ignoreUnknown = true)
    public class DorisResponse {
    	@JsonProperty("Status")
        private String status;   
        @JsonProperty("ErrorURL")
        private String errorURL; 
    }
  2. @JsonProperty 是强制绑定标记,它会覆盖 Jackson 所有默认的属性名推导和命名匹配规则

  3. Jackson在扫描 类 的所有属性 时 发现@JsonProperty 注解,然后将类的属性名 和 注解属性 关联在一起,然后 通过 属性名 首字母 大写 前面加 set 找到该属性的 setter 方法,最后通过 反射的 invoke方法,就将 JSON 字段注入到对象属性中

相关推荐
寻星探路3 分钟前
【算法专题】滑动窗口:从“无重复字符”到“字母异位词”的深度剖析
java·开发语言·c++·人工智能·python·算法·ai
程序员小白条3 分钟前
面试 Java 基础八股文十问十答第八期
java·开发语言·数据库·spring·面试·职场和发展·毕设
Dxy12393102164 分钟前
python连接minio报错:‘SSL routines‘, ‘ssl3_get_record‘, ‘wrong version number‘
开发语言·python·ssl
❆VE❆8 分钟前
WebSocket与SSE深度对比:技术差异、场景选型及一些疑惑
前端·javascript·网络·websocket·网络协议·sse
大王小生9 分钟前
C# CancellationToken
开发语言·c#·token·cancellation
listhi5209 分钟前
基于C#实现屏幕放大镜功能
开发语言·c#
萤丰信息10 分钟前
从 “钢筋水泥” 到 “数字神经元”:北京 AI 原点社区重构城市进化新逻辑
java·大数据·人工智能·安全·重构·智慧城市·智慧园区
rgeshfgreh13 分钟前
Java高性能开发:Redis7持久化实战
前端·bootstrap·mybatis
我叫袁小陌34 分钟前
C++多线程全面详解
开发语言·c++
李剑一37 分钟前
uni-app使用html5+创建webview,可以控制窗口大小、显隐、与uni通信
前端·trae