如何解决如何序列化不同类型的字段?
我有以下数据类来解析 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 举报,一经查实,本站将立刻删除。