JSON反序列化大小写不匹配问题:接收大写键名JSON时无法映射到实体类
JSON反序列化大小写不匹配问题:接收大写键名JSON时无法映射到实体类
兄弟,我太懂你踩的这个坑了!咱们先把问题根源理清楚,再给你靠谱的解决方案:
为什么改实体类字段为大写还是不行?
你把code改成CODE、sku改成SKU后,Lombok的@Data注解会按照JavaBean规范生成getter/setter方法:
- 字段
CODE对应的getter是getCODE(),setter是setCODE() - 但Jackson默认的反序列化逻辑是:对于JSON里的
CODE键,它会尝试匹配名为code的字段,或者符合小驼峰规范的setCode()方法,两者完全不匹配,所以映射失败。
解决方案1:用@JsonProperty精准指定映射关系
这个方法最直接,不用改字段名,只需要在实体类字段上加上@JsonProperty注解,明确绑定JSON里的大写键名即可:
package com.akensys.testlucas.model; import jakarta.persistence.Entity; import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.Id; import lombok.Data; import com.fasterxml.jackson.annotation.JsonProperty; // 记得导入这个包 @Entity @Data public class Vetement { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @JsonProperty("CODE") private int code; @JsonProperty("SKU") private String sku; }
这样不管你传的JSON键是小写code还是大写CODE,都能精准映射到实体类的对应字段。
解决方案2:全局配置Jackson忽略大小写
如果有大量实体类需要处理大小写问题,一个个加注解太麻烦,可以全局开启Jackson的大小写忽略功能:
方式1:通过配置文件快速开启
在application.properties里添加一行配置:
spring.jackson.mapper.accept-case-insensitive-properties=true
方式2:自定义ObjectMapper实现更灵活配置
如果需要额外定制Jackson规则,可以写一个配置类:
import com.fasterxml.jackson.databind.MapperFeature; import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class JacksonConfig { @Bean public ObjectMapper objectMapper() { ObjectMapper objectMapper = new ObjectMapper(); // 开启属性大小写忽略 objectMapper.enable(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES); return objectMapper; } }
配置完成后,所有JSON的键名大小写都会被自动忽略,不管是code、CODE还是Code,都能正确映射到实体类的code字段。
备注:内容来源于stack exchange,提问作者CosmosFutur
相关产品推荐
相关产品推荐

