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
相关产品推荐
相关产品推荐

