使用Jackson Yaml反序列化对象数组时抛出MismatchedInputException求助
问题根因
你启用了Jackson的全局多态类型序列化配置activateDefaultTyping,该配置默认会为所有符合条件的类型添加类型元信息,且默认用WRAPPER_ARRAY格式存储类型信息。但枚举属于基础值类型,序列化时不会生成数组包裹的类型元信息,反序列化时Jackson按照多态规则期望读取数组开头的类型信息,实际读到的是枚举的字符串值,因此抛出类型不匹配异常。
另外序列化输出的JDK内置不可变集合类标记!<java.util.ImmutableCollections$List12>属于JDK内部实现类,不同JDK版本不兼容,也会带来反序列化隐患。
解决方案
方案1:关闭不必要的全局多态配置(最推荐)
如果你的业务场景没有需要序列化多态子类的需求,直接删除ObjectMapperProvider中的objectMapper.activateDefaultTyping(...)这行配置即可,你的现有业务模型没有显式的多态继承结构,完全不需要开启这个配置。
方案2:调整全局多态类型的适用范围
如果必须保留全局多态配置,可以修改配置规则,指定仅对非具体业务类型生效,排除枚举、基础类型、集合等基础类型的多态校验:
// 替换原来的activateDefaultTyping调用 objectMapper.activateDefaultTyping( objectMapper.getPolymorphicTypeValidator(), ObjectMapper.DefaultTyping.NON_CONCRETE_AND_ARRAYS, JsonTypeInfo.As.PROPERTY // 可选:用属性存储类型信息比数组包裹兼容性更好 );
方案3:为枚举类型强制指定序列化格式
如果需要保留当前全局配置不变,可以给Action枚举单独添加注解,强制Jackson按普通字符串序列化/反序列化,忽略多态类型规则:
@JsonFormat(shape = JsonFormat.Shape.STRING) public enum Action { Left, Right, Up, Down; }
附加优化:修复不可变集合兼容问题
添加Jackson的JDK8+模块支持,让Jackson可以正确处理JDK不可变集合,避免序列化出内部类标记:
- 引入
jackson-datatype-jdk8依赖 - 注册模块到ObjectMapper:
objectMapper.registerModule(new Jdk8Module());
内容的提问来源于stack exchange,提问作者Walter
相关产品推荐
相关产品推荐

