Jackson UnrecognisedPropertyException问题:JSON转Java对象失败求助
我来帮你捋清楚这个问题的来龙去脉,以及对应的解决办法~
首先得明白为什么Spring控制器里能正常转换,但自己直接用ObjectMapper就报错:Spring MVC默认已经给它用的ObjectMapper做了一系列配置,比如忽略未知属性、支持驼峰与下划线命名转换等,而你手动new出来的ObjectMapper是Jackson的默认严格配置,所以会抛出这个异常。
下面分几种情况给出解决方案:
1. 最常见原因:开启忽略未知属性
如果你的JSON数据里包含了实体类中未定义的字段,默认的ObjectMapper会直接报错。只需手动关闭这个严格校验:
ObjectMapper objectMapper = new ObjectMapper(); // 关闭未知属性报错的配置 objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); // 执行反序列化操作 LocationCustomDataItem item = objectMapper.readValue(jsonString, LocationCustomDataItem.class);
2. 字段名匹配问题
如果JSON里的locationCustomDataAttributes字段和你的实体类命名风格不一致(比如JSON是下划线分隔location_custom_data_attributes,实体类是驼峰命名),Spring的ObjectMapper默认已经处理了这种转换,但你自己的ObjectMapper没有。可以用两种方式解决:
方式一:用@JsonProperty注解指定字段名
在LocationCustomDataItem类的对应字段上添加注解,明确绑定JSON中的字段名:
public class LocationCustomDataItem { @JsonProperty("locationCustomDataAttributes") private LocationCustomDataAttributes locationCustomDataAttributes; // 别忘了添加对应的getter和setter方法,Jackson默认依赖这些方法完成序列化/反序列化 public LocationCustomDataAttributes getLocationCustomDataAttributes() { return locationCustomDataAttributes; } public void setLocationCustomDataAttributes(LocationCustomDataAttributes locationCustomDataAttributes) { this.locationCustomDataAttributes = locationCustomDataAttributes; } }
方式二:全局配置命名策略
给你的ObjectMapper设置命名策略,让它自动处理驼峰与下划线的转换:
ObjectMapper objectMapper = new ObjectMapper(); // 若JSON是下划线命名、实体类是驼峰,用这个策略 objectMapper.setPropertyNamingStrategy(PropertyNamingStrategies.SNAKE_CASE);
3. 直接复用Spring的ObjectMapper
如果你是在Spring项目里,最简单的方式就是直接注入Spring已经配置好的ObjectMapper实例,这样它的行为就和控制器里完全一致:
@Autowired private ObjectMapper objectMapper; // 直接用这个实例执行反序列化即可
最后检查一个细节
确保你的LocationCustomDataAttributes是标准POJO:有无参构造器,所有需要反序列化的字段都有对应的getter和setter方法——Jackson需要这些来正确实例化和赋值对象。
内容的提问来源于stack exchange,提问作者jbailie1991

