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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 11:39:57