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

Jackson反序列化无键JSON数组至嵌套类时出现MismatchedInputException问题

问题排查:Jackson反序列化数组时的MismatchedInputException

你遇到的这个异常核心原因就是JSON结构和你定义的Java类结构完全不匹配,结合你的场景,具体问题大概率是这几个:

1. 用单个对象类接收数组JSON

你的原始数据是无外层键的JSON数组(比如 [{"name":"foo","number":123}, ...]),但你却用FooResClass(继承BaseResModel的单个对象类)去接收。Jackson会尝试把数组解析成一个FooResClass实例,显然数组和单个对象的结构完全对不上,直接抛出类型不匹配异常。

2. 内部类AData不是静态的

如果AData是FooResClass的普通内部类(非静态),Jackson没法直接实例化它——非静态内部类必须依赖外部FooResClass的实例才能创建,而反序列化数组的时候根本没有这个外部实例,自然会报错。

3. 父类BaseResModel的结构冲突

如果BaseResModel本身带有一些通用响应字段(比如code、message这类),Jackson会尝试把数组里的每个元素去匹配这些父类字段,但你的数组元素只有name和number,不存在这些父类字段,也会触发结构不匹配的异常。

4. 没正确用泛型集合接收数组

就算你想在FooResClass里用集合装AData,如果反序列化时没明确指定泛型类型(比如直接用objectMapper.readValue(json, FooResClass.class)),Jackson会把数组解析成LinkedHashMap的集合,而不是AData实例,后续也会因为类型不匹配抛出异常。


对应的修复方法
  • 调整目标类型:直接用List<AData>作为反序列化的目标类型,而不是FooResClass;如果必须保留FooResClass,可以给它加一个List<AData>类型的字段,同时把原始JSON数组包装成带外层键的结构(比如{"data": [ ... ]}),或者自定义反序列化器来处理无外层键的数组。
  • 把AData改成静态内部类:将class AData改为static class AData,让它可以独立实例化,Jackson就能正常解析了。
  • 隔离父类字段干扰:如果BaseResModel是给单对象响应设计的,别让接收数组的类继承它;如果必须继承,给FooResClass加上@JsonIgnoreProperties(ignoreUnknown = true),让Jackson忽略父类中不存在的字段。
  • 明确泛型类型:反序列化时用objectMapper.readValue(jsonStr, new TypeReference<List<AData>>() {})来指定泛型,确保Jackson解析出正确的AData集合。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 11:45:26