Java中Jackson解析JSON为POJO时Country字段反序列化报错排查
问题原因
你的POJO结构和JSON实际结构不匹配,是映射失败的核心原因:
- 你贴的JSON里,
Country节点本身就是动态键值对结构:键是国家代码(US/CA/AU等),值是对应国家的详情对象,不存在外层包装的countryData属性。 - 你自定义的
Country类是普通JavaBean,Jackson会尝试将Country节点下的属性映射到该类的同名字段,但你的Country类只有countryData字段,JSON中完全不存在这个键,再加上接口部分返回场景下Country字段会返回空数组[](异常信息里的JsonToken.START_ARRAY就对应这个场景),就直接触发了反序列化异常。
修正步骤
- 直接删除多余的
Country包装类,不需要这层嵌套。 - 修改
OfferData类里的Country字段类型,直接用Map<String, CountryData>接收动态键值对结构。
修正后的OfferData代码如下:
@Getter @Setter @JsonIgnoreProperties(ignoreUnknown = true) public class OfferData { @JsonProperty("Offer") private Offer offer; @JsonProperty("Country") private Map<String, CountryData> countryMap; }
- 原有的
CountryData类结构完全符合JSON里的国家详情结构,不需要改动,直接保留即可。
特殊场景兼容
异常信息提示存在Country值为数组的情况,说明接口返回不规范:空值场景下可能返回[]而不是空对象{}。如果需要兼容这种不规范返回,可以给字段加简单的反序列化容错,比如自定义反序列化器遇到数组类型时直接返回空Map,避免接口偶发返回异常格式导致接口报错。
内容的提问来源于stack exchange,提问作者Gabriel
相关产品推荐
相关产品推荐

