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
相关产品推荐
相关产品推荐

