使用Kotlin encodeToString序列化时丢失isCompleted字段的问题
问题解决:Kotlin序列化时isCompleted字段缺失
问题重现
使用Kotlin序列化库的encodeToString()方法序列化TripInfo实例时,isCompleted字段未出现在JSON结果中:
- 待序列化实例:
TripInfo(tripId=73, chunkSize=10485760, isCompleted=0)
- 序列化后JSON:
{"tripId":73,"chunkSize":10485760}
- 数据模型定义:
import kotlinx.serialization.Serializable @Serializable data class TripInfo( val tripId: Long? = null, val chunkSize: Long = 0, val isCompleted: Int = 0, )
原因分析
Kotlin序列化库默认不会序列化值等于默认值的属性。这里isCompleted的默认值是0,而实例中该字段的值也是0,所以被自动忽略了。
解决方案
有两种方式可以解决这个问题:
方案1:全局开启默认值序列化
在调用encodeToString()时,配置Json实例开启encodeDefaults:
val json = Json { encodeDefaults = true } val serializedString = json.encodeToString(tripInfo)
这样所有等于默认值的属性都会被序列化到JSON中。
方案2:单独指定字段强制序列化
如果只想让isCompleted字段强制序列化,不管是否等于默认值,可以给该字段添加@EncodeDefault注解:
import kotlinx.serialization.Serializable import kotlinx.serialization.EncodeDefault @Serializable data class TripInfo( val tripId: Long? = null, val chunkSize: Long = 0, @EncodeDefault val isCompleted: Int = 0, )
这样即使isCompleted的值等于默认值0,也会被包含在序列化结果里。
内容的提问来源于stack exchange,提问作者Saeed Noshadi
相关产品推荐
相关产品推荐

