Kotlinx.serialization能否处理多态属性值?统一JSON字段类型
不同类型JSON字段解析为同一Serializable对象的实现方案
可以通过自定义Kotlin序列化器实现这个需求,把不同类型的someValue统一转为字符串(或其他目标类型)后映射到同一个@Serializable对象中。
步骤1:定义目标数据类
给目标字段指定自定义序列化器,明确最终类型为字符串:
import kotlinx.serialization.Serializable import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor import kotlinx.serialization.descriptors.PrimitiveKind import kotlinx.serialization.descriptors.SerialDescriptor import kotlinx.serialization.encoding.Decoder import kotlinx.serialization.encoding.Encoder import kotlinx.serialization.KSerializer @Serializable(with = SomeValueSerializer::class) data class MyData(val someValue: String)
步骤2:实现自定义序列化器
这个序列化器会在解析时自动处理Int和String类型的someValue,统一转为字符串:
object SomeValueSerializer : KSerializer<String> { // 描述序列化器的元数据 override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor("SomeValue", PrimitiveKind.STRING) // 序列化时直接输出字符串 override fun serialize(encoder: Encoder, value: String) { encoder.encodeString(value) } // 反序列化时兼容两种类型 override fun deserialize(decoder: Decoder): String { return try { // 先尝试按整数解析,转成字符串 decoder.decodeInt().toString() } catch (e: Exception) { // 解析整数失败时,直接按字符串读取 decoder.decodeString() } } }
测试验证
不管是传入数字类型的JSON:
{ "someValue": 123 }
还是字符串类型的JSON:
{ "someValue": "123" }
最终都会被解析为MyData(someValue = "123"),实现了统一类型的解析目标。
如果需要统一转为整数类型,只需调整deserialize逻辑:先尝试解析字符串再转整数,失败则直接读取整数即可。
内容的提问来源于stack exchange,提问作者georgij
相关产品推荐
相关产品推荐

