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

如何让Kotlin数据类中@JsonUnwrapped注解实现反序列化?

Kotlin数据类中Jackson @JsonUnwrapped反序列化问题解决

你遇到的问题是:使用@JsonUnwrapped注解的Kotlin数据类可以正常序列化,但反序列化时抛出错误:

com.fasterxml.jackson.databind.exc.InvalidDefinitionException: 无法将Creator属性"property name"定义为@JsonUnwrapped:暂不支持该组合

原因很明确:Kotlin数据类的主构造器参数会被Jackson识别为Creator属性,而Jackson目前不支持在Creator属性上搭配@JsonUnwrapped使用。

除了自定义反序列化器,还有两种简易方案可以解决:

方案一:将@JsonUnwrapped属性移至类体,改用无参构造器

把原本放在主构造器的@JsonUnwrapped属性移到类体中,同时确保类有可被Jackson识别的无参构造器(可借助kotlin-noarg插件自动生成):

@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY)
@JsonNaming(PropertyNamingStrategies.LowerCamelCaseStrategy::class)
@Schema(description = "Customer Details", allOf = [Address::class, Person::class])
data class CustomerDetails() {
    @JsonUnwrapped
    var addressDetails: Address? = null

    @JsonUnwrapped
    var personDetails: Person? = null
}

注意:这种方式下数据类的equals/hashCode逻辑会基于空构造器的初始状态,若需要保留原有的属性对比逻辑,可手动重写equals和hashCode方法。

方案二:改用普通类+@JsonCreator手动映射构造器

放弃数据类,改用普通类,通过@JsonCreator注解手动编写构造器,将扁平化的JSON字段映射到对应的嵌套属性中:

@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY)
@JsonNaming(PropertyNamingStrategies.LowerCamelCaseStrategy::class)
@Schema(description = "Customer Details", allOf = [Address::class, Person::class])
class CustomerDetails {
    @JsonUnwrapped
    val addressDetails: Address?
    @JsonUnwrapped
    val personDetails: Person?

    @JsonCreator
    constructor(
        houseNumber: Int?,
        streetName: String?,
        city: String?,
        firstName: String?,
        lastName: String?,
        initials: String?
    ) {
        addressDetails = Address(houseNumber, streetName, city)
        personDetails = Person(firstName, lastName, initials)
    }
}

这种方式完全由手动控制字段映射,能精准匹配扁平化的JSON结构,同时保留@JsonUnwrapped的序列化效果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 13:55:53