Jackson解析JSON数组遇UnrecognizedPropertyException,求排查映射问题
咱们先拆解下报错的核心原因:
com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "PaymentRequest" (class vpos.dto.MyWrapper), not marked as ignorable (one known property: "paymentRequest"])
这说明Jackson在解析MyWrapper类时,找不到和JSON里"PaymentRequest"键对应的字段——你的MyWrapper里的字段是paymentRequest(小驼峰命名),但JSON里的键是PaymentRequest(首字母大写),默认情况下Jackson没法自动匹配这两个名字。再加上你在PaymentRequest类上用了@JsonRootName注解,这个注解原本是用来处理根节点层级的包装,但你现在额外用MyWrapper做了一层包装,就导致了解析逻辑的冲突。
下面给你几种可行的解决办法:
方案一:给MyWrapper的字段添加@JsonProperty映射
直接在MyWrapper的paymentRequest字段上标注@JsonProperty,指定它对应的JSON键名即可:
public class MyWrapper{ @JsonProperty("PaymentRequest") PaymentRequest paymentRequest; // getter、setter方法 }
这样Jackson就能明确知道JSON里的"PaymentRequest"对应MyWrapper的paymentRequest字段,解析就不会报错了。
方案二:去掉MyWrapper,直接解析为List
既然你已经在PaymentRequest类上用了@JsonRootName("PaymentRequest"),可以开启Jackson的解包根节点特性,直接把每个{"PaymentRequest": {...}}结构解析成PaymentRequest对象,不需要额外的MyWrapper:
ObjectMapper mapper = new ObjectMapper(); // 开启解包根节点的特性 mapper.enable(DeserializationFeature.UNWRAP_ROOT_VALUE); List<PaymentRequest> requests = mapper.readValue(jsonString, new TypeReference<List<PaymentRequest>>() {});
这种方式更简洁,也符合@JsonRootName注解的设计初衷。
方案三:修改MyWrapper的字段名(不推荐)
把MyWrapper的字段名改成PaymentRequest(和JSON键完全一致):
public class MyWrapper{ PaymentRequest PaymentRequest; // getter、setter方法 }
但这种写法不符合Java的驼峰命名规范,会降低代码可读性,所以不推荐使用。
内容的提问来源于stack exchange,提问作者bmck

