jackson 报 mismatchedinputexception 的本质是 json 结构与 java 类型不匹配,常见于数组/对象类型错配、无参构造函数缺失、字段类型冲突及泛型擦除导致的类型信息丢失。

Jackson 报 MismatchedInputException,本质是“结构对不上”——不是语法错,而是 JSON 的形状和 Java 类的预期不匹配。它不报编译错误,只在运行时炸,而且错误信息里常带关键词:Cannot deserialize instance of … from START_ARRAY / START_OBJECT / String value。抓住这个提示,基本就锁定了根因。
JSON 是数组,但你试图反序列化成单个对象
比如后端接口返回的是一个 JSON 数组:
[{"name":"Alice","age":25},{"name":"Bob","age":30}]而你写了:
User user = objectMapper.readValue(json, User.class);Jackson 看到 [(START_ARRAY),却被告知要造一个 User 实例(需要 {,即 START_OBJECT),立刻抛异常。
- ✅ 正确做法:明确告诉 Jackson 这是个列表 —— 用
TypeReference<list>></list> - ✅ 或者先定义包装类,如
ResponseWrapper<list>></list>,再反序列化 - ⚠️ 别用
ArrayList.class直接传 —— 泛型擦除会让 Jackson 不知道元素类型
Java 类缺无参构造函数
Jackson 默认靠无参构造器 + setter(或字段直赋)来创建对象。如果类是:
public class DiskLatencyBean {private String disk;
public DiskLatencyBean(String disk) { this.disk = disk; }
}
没有 DiskLatencyBean(),反序列化时就会报 Cannot construct instance of ...。
- ✅ 补一个 public 无参构造函数(最简单直接)
- ✅ 或加
@JsonCreator+@JsonProperty标注全参数构造器 - ✅ Lombok 用户加
@NoArgsConstructor即可
字段类型和 JSON 值类型硬冲突
前端传了数组,你 Java 字段却声明为 String:
{"taskPathList": ["a.txt", "b.log"]}对应类里写:
private String taskPathList;Jackson 想把 ["a.txt", "b.log"] 塞进字符串字段,当然失败。
- ✅ 检查字段类型是否与实际 JSON 值严格一致:数组 ↔ List/Array,对象 ↔ POJO,字符串 ↔ String,数字 ↔ Number 子类
- ✅ 开启
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)避免未知字段干扰 - ✅ 用
@JsonIgnoreProperties(ignoreUnknown = true)在类上兜底
嵌套类或泛型没传准类型信息
常见于反序列化含泛型的集合,例如 List<adata></adata>。如果只写:
Jackson 不知道 AData 是什么,可能选错反序列化器,尤其遇到空数组 [] 时容易崩。
- ✅ 必须用
new TypeReference<list>>() {}</list>显式传递完整泛型路径 - ✅ 对嵌套内部类(非 static),确保它有无参构造器 —— 否则连实例都 new 不出来
- ✅ 静态内部类更安全,推荐优先使用
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











