You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

解决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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 04:43:14