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 字段注入到对象属性中

相关推荐
转转技术团队2 小时前
基于微前端 qiankun 多实例保活的工程实践
前端·javascript·前端工程化
松涛和鸣2 小时前
37、UDP网络编程入门
linux·服务器·前端·网络·udp·php
坐吃山猪2 小时前
Python命令行工具Click
linux·开发语言·python
宠..2 小时前
为单选按钮绑定事件
运维·服务器·开发语言·数据库·c++·qt·microsoft
业精于勤的牙2 小时前
最长特殊序列(一)
java·javascript·数据结构
咋吃都不胖lyh2 小时前
在任务管理器中筛选、查看进程
java·开发语言
宠..2 小时前
对单选按钮分组
开发语言·数据库·c++·qt·安全·安全性测试
大学生资源网2 小时前
基于JavaWeb的邮件收发系统的设计与实现(源码+文档)
java·开发语言·spring boot·mysql·毕业设计·源码·课程设计
cici158742 小时前
基于高斯混合模型(GMM)的说话人识别系统MATLAB实现
开发语言·人工智能·matlab