如何使用 Jackson 的多态反序列化根据 JSON 字段动态创建子类实例

云雪小哥_6481

云雪小哥_6481

2026-10-10

803人浏览

原创

如何使用 Jackson 的多态反序列化根据 JSON 字段动态创建子类实例

本文详解如何通过 Jackson 的 @JsonTypeInfo 和 @JsonSubTypes 注解,实现基于 JSON 中 type 字段值自动选择并实例化对应子类(如 MyClass1/MyClass2),从而避免手动类型判断,提升反序列化灵活性与可维护性。

本文详解如何通过 jackson 的 `@jsontypeinfo` 和 `@jsonsubtypes` 注解,实现基于 json 中 type 字段值自动选择并实例化对应子类(如 myclass1/myclass2),从而避免手动类型判断,提升反序列化灵活性与可维护性。

Jackson 默认仅根据声明类型(如 BaseClass)进行反序列化,无法自动识别运行时应创建的具体子类。要实现“根据 "type": "MyClass1" 动态构造 MyClass1 实例”,需启用其多态类型处理(Polymorphic Type Handling)机制——核心在于为基类添加元数据注解,显式告知 Jackson 如何将 JSON 中的类型标识映射到 Java 类。

关键步骤如下:

  1. 在基类 BaseClass 上添加类型识别注解:
    使用 @JsonTypeInfo 指定类型信息来源(此处为 JSON 属性 "type"),并用 @JsonSubTypes 声明所有合法子类及其对应名称:
@JsonTypeInfo(
    use = JsonTypeInfo.Id.NAME,     // 使用自定义名称(非类全限定名)
    include = JsonTypeInfo.As.PROPERTY, // 将类型信息作为 JSON 属性嵌入
    property = "type"               // 对应 JSON 中的字段名
)
@JsonSubTypes({
    @JsonSubTypes.Type(value = MyClass1.class, name = "MyClass1"),
    @JsonSubTypes.Type(value = MyClass2.class, name = "MyClass2")
})
public class BaseClass {
    String id;
    // 注意:type 字段仍需保留(Jackson 会自动读取并用于类型匹配,无需手动赋值)
}
  1. 确保子类无额外干扰注解:
    MyClass1 和 MyClass2 保持简洁,继承即可,无需重复标注(除非需定制子类序列化行为):
public class MyClass1 extends BaseClass { /* 可扩展字段或方法 */ }
public class MyClass2 extends BaseClass { /* 可扩展字段或方法 */ }
  1. 反序列化时直接使用泛型集合:
    ObjectMapper 会自动根据 "type" 值选择目标子类,无需修改 SomeClass 定义:
ObjectMapper mapper = new ObjectMapper();
String json = "{ \"list\": [{\"id\":\"1\",\"type\":\"MyClass1\"}, {\"id\":\"2\",\"type\":\"MyClass2\"}] }";
SomeClass result = mapper.readValue(json, SomeClass.class);
// result.list 现在包含 MyClass1 和 MyClass2 实例,而非 BaseClass

✅ 注意事项:

Wjs Localizing Video
Wjs Localizing Video

用于端到端视频本地化流程的轻量编排器,路由至四个专注子技能——/wjs-transcribing-audio、/wjs-translating-subtitles...

下载
  • @JsonTypeInfo 必须标注在基类(或接口)上,而非字段或容器类;
  • name 值必须与 JSON 中 "type" 字段的字符串严格一致(区分大小写);
  • 若 BaseClass 中已有 type 字段,Jackson 会自动将其设为反序列化后的值,但该字段不参与类型推断逻辑——推断完全由注解配置驱动;
  • 如需支持未知 type 值,可添加 @JsonSubTypes.Type(value = BaseClass.class, name = "unknown") 或配置 @JsonTypeInfo(defaultImpl = BaseClass.class) 作为兜底。

此方案是 Jackson 处理多态 JSON 的标准实践,语义清晰、类型安全,且完全避免运行时 instanceof 判断或反射手动构造,显著提升代码健壮性与可测试性。

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

2023.06.15

10137

6

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

2023.07.05

7262

9

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

2023.07.31

6392

8

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.01

1104

3

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.02

908

3

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

1336

5

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

2669

5

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

2023.08.03

19991

3

配置java环境变量
配置java环境变量

配置Java环境变量是为了让操作系统能够识别和使用Java的相关命令和功能。本专题为大家提供配置java环境变量相关文章,帮助大家解决问题。

2023.08.03

1175

8

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WEB前端教程【HTML5+CSS3+JS】
WEB前端教程【HTML5+CSS3+JS】

共101课时 | 20.9万人学习

JS进阶与BootStrap学习
JS进阶与BootStrap学习

共39课时 | 4.8万人学习