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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 19:42:39