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

使用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不可变集合,避免序列化出内部类标记:

  1. 引入jackson-datatype-jdk8依赖
  2. 注册模块到ObjectMapper:
objectMapper.registerModule(new Jdk8Module());

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 20:48:02