使用Java类反序列化JSON数组遇MismatchedInputException求助
Java JSON反序列化报错排查
问题信息
Java新手在反序列化JSON响应时出现错误,调整类结构后仍未解决,相关内容如下:
JSON响应内容
[{"index": 514042,"source_list_name": "insurance_group","allow_multiple_account_associates": false,"source_list_index": 10078,"fields": {"type": "e212"},"is_editable": false,"allow_associates": false},{"is_editable": true,"fields": {"type": "i120"},"allow_associates": false,"allow_multiple_account_associates": false,"index": 533402},{"is_editable": true,"fields": {"type": "i119"},"allow_associates": false,"allow_multiple_account_associates": false,"index": 514519}]
编写的Java类代码
package com.ls.json.pack import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @AllArgsConstructor @Data @JsonIgnoreProperties(ignoreUnknown = true) public class EmploymentSalaryTypeResponse { public class Fields{ private String type; } @AllArgsConstructor @NoArgsConstructor @Data public class Root{ private int index; private String source_list_name; private boolean allow_multiple_account_associates; private int source_list_index; private Fields fields; private boolean is_editable; private boolean allow_associates; } }
报错信息(已翻译)
Caused by: com.fasterxml.jackson.databind.exc.MismatchedInputException: 无法将数组值反序列化为类型 `com.ls.json.pack.EmploymentSalaryTypeResponse`(令牌 `JsonToken.START_ARRAY`) [来源: (org.springframework.core.io.buffer.DataBufferInputStream); 行: 1, 列: 1] at com.fasterxml.jackson.databind.exc.MismatchedInputException.from(MismatchedInputException.java:59) at com.fasterxml.jackson.databind.DeserializationContext.reportInputMismatch(DeserializationContext.java:1746) at com.fasterxml.jackson.databind.DeserializationContext.handleUnexpectedToken(DeserializationContext.java:1520) at com.fasterxml.jackson.databind.DeserializationContext.handleUnexpectedToken(DeserializationContext.java:1467) at com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeFromArray(BeanDeserializer.java:650) at com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeOther(BeanDeserializer.java:211) at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:187)
错误原因及修复方案
1. 根类型不匹配
JSON最外层是数组[],但你尝试将其反序列化为单个EmploymentSalaryTypeResponse对象,这是核心错误。需要将目标类型改为List<Root>,而非外层的EmploymentSalaryTypeResponse。
2. 内部类实例化问题
Fields是普通内部类,Jackson无法直接实例化非静态内部类(需要依赖外部类实例),必须改为静态内部类(添加static关键字)。
3. 可选字段类型错误
source_list_index在部分JSON对象中不存在,使用int类型会导致反序列化失败(int不能为null),需改为Integer类型适配字段缺失场景。
修正后的Java代码
package com.ls.json.pack; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; public class EmploymentSalaryTypeResponse { // 改为静态内部类,添加Lombok注解确保序列化正常 @Data @AllArgsConstructor @NoArgsConstructor public static class Fields { private String type; } @AllArgsConstructor @NoArgsConstructor @Data @JsonIgnoreProperties(ignoreUnknown = true) public static class Root { private int index; private String source_list_name; private boolean allow_multiple_account_associates; // 改为Integer类型,适配字段缺失情况 private Integer source_list_index; private Fields fields; private boolean is_editable; private boolean allow_associates; } }
反序列化示例代码
使用Jackson时,需指定反序列化为List类型:
ObjectMapper objectMapper = new ObjectMapper(); List<EmploymentSalaryTypeResponse.Root> responseList = objectMapper.readValue( jsonString, new TypeReference<List<EmploymentSalaryTypeResponse.Root>>() {} );
内容的提问来源于stack exchange,提问作者Kal C
相关产品推荐
相关产品推荐

