微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何序列化不同类型的字段?

如何解决如何序列化不同类型的字段?

我有以下数据类来解析 JSON。我可以使用 decodeFromString 方法轻松解析它。但是,Info 类可能不时包含 List<Int> 类型以及 Int 类型,以便将两者都包含在单个 JSON 中。如何处理序列化中的这种变化?

@Serializable
data class Node (@SerialName("nodeContent") val nodeContent: List<Info>)
@Serializable
data class Info (@SerialName("info") val info: Int)

附言最接近我的问题是这个:Kotlinx Serialization,avoid crashes on other datatype。不知道有没有其他方法

编辑: 下面给出一个例子。

"nodeContent": [
    {
        "info": {
            "name": "1",},{
        "info": [
            {
                "name": "1"
            },{
                "name": "2"
            },],{
        "info": {
            "name": "2",}
]

解决方法

这是一种使用类似于您提供的链接的自定义序列化程序的方法。这个想法是返回一个只有一个元素的列表。

// Can delete these two lines,they are only for Kotlin scripts
@file:DependsOn("org.jetbrains.kotlinx:kotlinx-serialization-json:1.2.0")
@file:CompilerOptions("-Xplugin=/snap/kotlin/current/lib/kotlinx-serialization-compiler-plugin.jar")

import kotlinx.serialization.*
import kotlinx.serialization.json.*
import kotlinx.serialization.encoding.Decoder

@Serializable
data class Node (val nodeContent: List<Info>)
@Serializable(with = InfoSerializer::class)
data class Info (val info: List<Name>)
@Serializable
data class Name (val name: Int)


@Serializer(forClass = Info::class)
object InfoSerializer : KSerializer<Info> {
    override fun deserialize(decoder: Decoder): Info {
        val json = ((decoder as JsonDecoder).decodeJsonElement() as JsonObject)
        return Info(parseInfo(json))
    }

    private fun parseInfo(json: JsonObject): List<Name> {
        val info = json["info"] ?: return emptyList()
        return try {
            listOf(Json.decodeFromString<Name>(info.toString()))
        } catch (e: Exception) {
            (info as JsonArray).map { Json.decodeFromString<Name>(it.toString()) }
        }
    }
}

用法:

val ss2 = """
{
    "nodeContent": [
        {
            "info":
                {"name": 1}
        },{
            "info": [
                {"name": 1},{"name": 2}
            ]
        },{
            "info":
                {"name": 2}
        }
    ]
}
"""

val h = Json.decodeFromString<Node>(ss2)
println(h)

结果:

Node(nodeContent=[Info(info=[Name(name=1)]),Info(info=[Name(name=1),Name(name=2)]),Info(info=[Name(name=2)])])

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。