解决Jackson映射含可变键JSON到POJO的未识别属性错误
解决Jackson解析含可变键JSON到POJO的问题
当JSON中存在可变键(如Berlin、Paris这类动态字段)时,直接用固定字段的POJO接收会触发UnrecognizedPropertyException,以下两种方案可以解决这个问题:
方案一:用Map直接接收可变键数据
如果你的JSON结构类似:
{
"language": "en",
"cities": {
"Berlin": {"population": 3645000},
"Paris": {"population": 2161000}
}
}
直接将POJO中对应可变键的字段定义为Map<String, City>类型,Jackson会自动把动态键作为Map的key,对应JSON对象转为City实例作为value:
public class LanguageData { private String language; // 用Map接收所有动态城市键值对 private Map<String, City> cities; // 省略getter、setter、构造方法 } public class City { private int population; // 省略getter、setter、构造方法 }
方案二:使用@JsonAnySetter注解处理
若想保留CityData类的结构,可在该类中添加一个Map字段,并通过@JsonAnySetter注解捕获所有未匹配的动态键:
public class LanguageData { private String language; private CityData cities; // 省略getter、setter、构造方法 } public class CityData { private Map<String, City> cityMap = new HashMap<>(); // 所有未匹配到固定字段的键值对都会调用此方法存入Map @JsonAnySetter public void addCity(String cityName, City cityInfo) { cityMap.put(cityName, cityInfo); } // 提供获取城市数据的方法 public Map<String, City> getCityMap() { return cityMap; } } public class City { private int population; // 省略getter、setter、构造方法 }
注意
不要直接通过关闭FAIL_ON_UNKNOWN_PROPERTIES来规避异常,这会丢失动态键对应的所有数据,只有当你不需要这些数据时才考虑使用:
ObjectMapper mapper = new ObjectMapper(); mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
内容的提问来源于stack exchange,提问作者AYa
相关产品推荐
相关产品推荐

