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

使用POJO反序列化JSON数组时遭遇MismatchedInputException求助

问题描述

尝试用代码获取JSON数组响应时,遇到com.fasterxml.jackson.databind.exc.MismatchedInputException异常。

接口响应内容

[
    {
        "performanceId": "0P0I",
        "companyId": "007XQ",
        "investmentId": "F0VTK"
    }
]

核心代码

public static ObjectMapper getJSONMapper() {
    objectMapper = new ObjectMapper();
    objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
    objectMapper.registerModule(new JavaTimeModule());
    return objectMapper;
}

ValidatableResponse response = given().header("Authorization", token)
        .header("Content-type", "application/json").body(testCaseBean.getRequest()).when().log().all()
        .post(EndPoint.SRM_BOB_RIC_API).then().log().all();
response.assertThat().statusCode(200);
actualRIOutput = CommonUtils.getJSONMapper()
        .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
        .readValue(response.extract().asString(), BoBSrmRicResponseBean.class);
System.out.println(actualRIOutput.getRicResponse().get(0).getCompanyId());

错误信息

com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize value of type `com.mtar.indexes.bean.BoBSrmRicResponseBean` from Array value (token `JsonToken.START_ARRAY`)
at [Source: (String)"[{"performanceId":"0P00BI","companyId":"0C07XQ","investmentId":"F0SVTK"}]"; line: 1, column: 1]
at com.fasterxml.jackson.databind.exc.MismatchedInputException.from(MismatchedInputException.java:59)
at com.fasterxml.jackson.databind.DeserializationContext.reportInputMismatch(DeserializationContext.java:1601)
at com.fasterxml.jackson.databind.DeserializationContext.handleUnexpectedToken(DeserializationContext.java:1375)
at com.fasterxml.jackson.databind.DeserializationContext.handleUnexpectedToken(DeserializationContext.java:1322)
at com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeFromArray(BeanDeserializer.java:640)
at com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeOther(BeanDeserializer.java:221)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:197)
at com.fasterxml.jackson.databind.deser.DefaultDeserializationContext.readRootValue(DefaultDeserializationContext.java:322)
at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4593)
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3548)
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3516)

定义的Bean结构

@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class RICMappingResponseBean {
    private String performanceId;
    private String companyId;
    private String investmentId;
}

@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class BoBSrmRicResponseBean {
    List<RICMappingResponseBean> ricResponse;
}

问题原因与解决方法

核心问题

接口返回的是JSON数组([]包裹),但你试图将其反序列化为单个BoBSrmRicResponseBean对象,Jackson无法将数组映射到包含列表的对象上,导致类型不匹配异常。

两种解决思路

思路1:直接反序列化为列表

修改反序列化代码,直接把响应字符串转为List<RICMappingResponseBean>,适配接口返回的数组格式:

List<RICMappingResponseBean> actualRIOutput = CommonUtils.getJSONMapper()
        .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
        .readValue(response.extract().asString(), new TypeReference<List<RICMappingResponseBean>>() {});

// 直接访问第一个元素的companyId
System.out.println(actualRIOutput.get(0).getCompanyId());

这里使用TypeReference是为了解决Java泛型擦除问题,让Jackson识别列表的泛型类型。

思路2:调整Bean结构匹配响应格式

如果必须用BoBSrmRicResponseBean接收,需要让接口返回一个包含ricResponse字段的JSON对象(而非数组),格式如下:

{
    "ricResponse": [
        {
            "performanceId": "0P0I",
            "companyId": "007XQ",
            "investmentId": "F0VTK"
        }
    ]
}

但如果无法修改接口响应,优先选择思路1解决问题。

内容的提问来源于stack exchange,提问作者Pratik

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 20:43:50