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

Kotlin序列化中密封类使用@SerialName注解失败求助

Kotlin序列化:密封类父类@SerialName在子类重写时的问题解决办法

这个问题的核心原因是:子类重写密封类的抽象属性时,父类的@SerialName注解不会自动继承到子类的重写属性上。默认情况下,序列化器会将子类重写属性的名称(也就是id)当作JSON字段名去匹配,而你的JSON里对应的字段是answerId,所以会抛出缺失字段的异常。

无需统一父类和子类属性名的解决办法很直接:在子类的重写属性上显式添加@SerialName注解,指定对应的JSON字段名即可。

修正后的代码示例

@Serializable
sealed class NetworkAnswer {
    @SerialName("answerId")
    abstract val id: Int
}

@Serializable
data class NetworkYesNoAnswer(
    @SerialName("answerId") // 显式指定JSON字段名
    override val id: Int,

    @SerialName("isPositive")
    val isPositive: Boolean
) : NetworkAnswer()

原理说明

Kotlin序列化框架中,属性的序列化配置(包括@SerialName)是绑定到具体属性上的,父类的注解不会自动传递给子类的重写属性。子类重写属性时,默认会使用自身的属性名作为序列化字段名,因此必须显式添加@SerialName来映射JSON中的answerId到子类的id属性。

这种写法既保留了父类和子类属性名的差异,又能正确完成JSON的反序列化。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 17:55:42