使用Kotlinx.Serialization解析嵌套的JSON

时间:2019-03-29 07:29:07

标签: json parsing kotlinx.serialisation

我一直在玩Kotlinx.serialization,并且我一直在尝试解析一个子字符串:

给出一个类似JSON的

{
   "Parent" : {
     "SpaceShip":"Tardis",
     "Mark":40
   }
}

我的代码如下:

data class SomeClass(
   @SerialName("SpaceShip") ship:String,
   @SerialName("Mark") mark:Int)

很显然,Json.nonstrict.parse(SomeClass.serializer(), rawString)将失败,因为“ SpaceShip”和“ Mark”对不在JSON的根中。

如何使序列化程序引用JSON的子树?

P.S:您会建议改型吗(因为它比较老,也许更成熟)?

谢谢

2 个答案:

答案 0 :(得分:1)

@Serializable
data class Parent(
    @SerialName("Parent")
    val someClass: SomeClass
)

@Serializable
data class SomeClass(
    @SerialName("SpaceShip")
    val ship: String,
    @SerialName("Mark")
    val mark: Int
)

fun getSomeClass(inputStream: InputStream): SomeClass {
    val json = Json(JsonConfiguration.Stable)
    val jsonString = Scanner(inputStream).useDelimiter("\\A").next()
    val parent = json.parse(Parent.serializer(), jsonString)
    return parent.someClass
}

答案 1 :(得分:0)

import kotlinx.serialization.*
import kotlinx.serialization.json.Json


@Serializable
data class Parent(
    @SerialName("Parent")
    val parent: SomeClass
)

@Serializable
data class SomeClass(
    @SerialName("SpaceShip")
    val ship:String,
    @SerialName("Mark")
    val mark:Int
)

fun main() {
    val parent = Json.parse(Parent.serializer(), "{\"Parent\":{\"SpaceShip\":\"Tardis\",\"Mark\":40}}")
    println(parent)
}