Jackson反序列化报错:无法从数组值反序列化Covid类型如何解决
错误原因
- 接口返回的根数据是JSON数组,你的代码尝试直接将数组反序列化为单个
Covid对象,类型不匹配触发了MismatchedInputException异常 - 你需要的
province、active字段不在根数组的元素层级,而是在根元素下的provinces子数组中,当前Covid类结构和接口返回的层级不匹配
解决方案
方案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; } }
- 新增外层响应类,对应接口返回的根数组元素结构:
public class CovidCountryResp { private List<Covid> provinces; public List<Covid> getProvinces() { return provinces; } public void setProvinces(List<Covid> provinces) { this.provinces = provinces; } }
- 修改反序列化代码,适配数组+层级结构:
// 导入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
相关产品推荐
相关产品推荐

