如何使用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
相关产品推荐
相关产品推荐

