使用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
相关产品推荐
相关产品推荐

