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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 21:09:07