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

Jackson反序列化报错:无法从数组值反序列化Covid类型如何解决

错误原因
  • 接口返回的根数据是JSON数组,你的代码尝试直接将数组反序列化为单个Covid对象,类型不匹配触发了MismatchedInputException异常
  • 你需要的province、active字段不在根数组的元素层级,而是在根元素下的provinces子数组中,当前Covid类结构和接口返回的层级不匹配
解决方案

方案1:调整实体类结构+适配反序列化逻辑

  1. 给现有Covid类添加无参构造方法(Jackson反序列化JavaBean必须依赖无参构造实例化对象)
public class Covid {
    String province;
    int active;

    // 新增无参构造
    public Covid() {
    }

    // 原有有参构造、getter、setter保留
    public Covid(String province, int active) {
        this.province = province;
        this.active = active;
    }

    public String getProvince() {
        return province;
    }

    public void setProvince(String province) {
        this.province = province;
    }

    public int getActive() {
        return active;
    }

    public void setActive(int active) {
        this.active = active;
    }
}
  1. 新增外层响应类,对应接口返回的根数组元素结构:
public class CovidCountryResp {
    private List<Covid> provinces;

    public List<Covid> getProvinces() {
        return provinces;
    }

    public void setProvinces(List<Covid> provinces) {
        this.provinces = provinces;
    }
}
  1. 修改反序列化代码,适配数组+层级结构:
// 导入TypeReference类
import com.fasterxml.jackson.core.type.TypeReference;

// ... 原有请求逻辑不变
try {
    // 先将返回的JSON数组反序列化为外层响应类的列表
    List<CovidCountryResp> countryRespList = oM.readValue(response.body(), new TypeReference<List<CovidCountryResp>>() {});
    // 取第一个国家的首个省份数据
    if (!countryRespList.isEmpty()) {
        List<Covid> provinceList = countryRespList.get(0).getProvinces();
        if (!provinceList.isEmpty()) {
            Covid covid = provinceList.get(0);
            System.out.println(covid);
        }
    }
} catch (JsonProcessingException e) {
    e.printStackTrace();
}

方案2:直接用JsonNode解析(无需新增实体类)

如果不想额外加外层实体类,可以直接通过JsonNode读取指定层级的节点再转成Covid对象(仍然需要保留Covid类的无参构造):

try {
    JsonNode root = oM.readTree(response.body());
    // 直接定位到provinces数组的第一个元素节点
    JsonNode targetProvince = root.get(0).get("provinces").get(0);
    Covid covid = oM.treeToValue(targetProvince, Covid.class);
    System.out.println(covid);
} catch (JsonProcessingException e) {
    e.printStackTrace();
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 02:18:01