Jackson映射JSON到Java模型类报UnrecognizedPropertyException如何解决
异常原因
- 核心错误是
Model类的属性类型定义错误:你在Model类中声明的model字段类型为Model本身,但JSON中models数组下每个model节点的内层是包含code、type等业务字段的对象,对应你预先定义的Model2类,类型不匹配导致Jackson在解析到code字段时,无法在Model类中找到对应属性,抛出未识别字段异常。 - 存在同类潜在错误:
FeatureType类中声明的feature_type字段类型为FeatureType本身,实际应该对应你定义的FeatureType2类,修复第一个错误后会触发同类异常。 - 代码语法错误:你写的反序列化代码多了一个右括号,正确写法为
om.readValue(myJsonString, Root.class)。
解决方案
方案1:直接修正现有类定义(成本最低)
仅需要修改两个类的属性类型即可正常运行:
// 修正Model类的属性类型 class Model{ public Model2 model; } // 修正FeatureType类的属性类型 class FeatureType{ public FeatureType2 feature_type; }
修正后再修复反序列化代码的语法错误,即可完成正常映射。
方案2:优化类结构,减少冗余包装类(更易维护)
你当前的JSON结构存在多层不必要的对象包装,我们可以简化类定义,避免多余的空包装类,同时提升代码可读性:
import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.databind.ObjectMapper; import java.util.List; import java.util.stream.Collectors; // 直接映射业务模型字段,不需要额外的Model2类 class BizModel { public String code; public String type; public String source; public String name; @JsonProperty("feature_types") public List<BizFeatureType> featureTypes; } // 直接映射特征类型字段,不需要额外的FeatureType2类 class BizFeatureType { public String code; public String desc; } // 根节点类 public class Root { public List<ModelWrapper> models; // 内部类仅用于处理外层的model包装节点 public static class ModelWrapper { @JsonProperty("model") public BizModel model; } // 内部类仅用于处理外层的feature_type包装节点 public static class FeatureTypeWrapper { @JsonProperty("feature_type") public BizFeatureType featureType; } // 提供工具方法直接获取业务数据,屏蔽包装层细节 public List<BizModel> getAllModels() { return models.stream() .map(wrapper -> wrapper.model) .collect(Collectors.toList()); } }
反序列化代码不需要额外修改,调用getAllModels()即可直接拿到所有业务模型数据,不需要逐层获取包装类属性。
临时兼容方案
如果不需要严格校验字段匹配,可以配置ObjectMapper忽略未知字段,避免报错(不推荐,会隐藏真实的字段匹配错误):
ObjectMapper om = new ObjectMapper(); om.configure(com.fasterxml.jackson.databind.DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
内容的提问来源于stack exchange,提问作者user222
相关产品推荐
相关产品推荐

