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

如何使用Jackson反序列化type字段在外层的密封类多态类型

实现外层Type字段的Jackson多态反序列化

要实现将Type字段放在Data层级(与id、value同级)的多态反序列化,核心是利用Jackson的@JsonTypeInfo注解的EXTERNAL_PROPERTY配置,让Jackson通过外层的type字段来决定value的具体类型。以下是具体实现步骤:

1. 定义密封类及其子类

首先明确SealedClass的具体子类,对应JSON中不同的value结构:

sealed class SealedClass

// 对应type为ADDRESS的value结构
data class Address(val address: String, val next: String) : SealedClass()

// 对应type为OPTION的value结构
data class Option(val count: String, val option: String) : SealedClass()

2. 调整Data类的注解配置

修改包含id、type、value的Data类,为value字段添加Jackson注解,指定使用外层的type字段作为类型标识符:

data class Response(
    val data: List<Data>
) {
    data class Data(
        val id: String, // 若JSON中id是数字,可改为Int类型,或用@JsonProperty做类型兼容
        val type: String,
        // 指定类型标识符为外部属性(Data类的type字段)
        @JsonTypeInfo(
            use = JsonTypeInfo.Id.NAME,
            include = JsonTypeInfo.As.EXTERNAL_PROPERTY,
            property = "type" // 对应外层的type字段名
        )
        // 映射type值与具体子类
        @JsonSubTypes(
            JsonSubTypes.Type(value = Address::class, name = "ADDRESS"),
            JsonSubTypes.Type(value = Option::class, name = "OPTION")
        )
        val value: SealedClass
    )
}

3. 配置Jackson ObjectMapper

确保引入Kotlin模块,避免Jackson处理Kotlin数据类时出现问题:

val objectMapper = ObjectMapper()
    .registerModule(KotlinModule()) // 需引入jackson-module-kotlin依赖

4. 测试反序列化

用目标JSON结构进行反序列化测试:

val targetJson = """
{
   "data":[
      {
         "id":"2",
         "type": "ADDRESS",
         "value":{
            "address":"1",
            "next":"3"
         }
      },
      {
         "id":"3",
         "type": "OPTION",
         "value":{
            "count":"1",
            "option":"3"
         }
      }
   ]
}
""".trimIndent()

val response = objectMapper.readValue(targetJson, Response::class.java)

关键说明

  • JsonTypeInfo.As.EXTERNAL_PROPERTY:告诉Jackson,类型标识符(type字段)不属于value对象本身,而是其所在父对象(Data)的属性。
  • property = "type":指定用来识别类型的字段名称为"type",需与JSON中的字段名完全一致。
  • @JsonSubTypes:建立type字段值与SealedClass子类的映射关系,确保Jackson能正确匹配类型。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 07:57:47