【问题标题】:Parse a nested JSON with Kotlinx.Serialization使用 Kotlinx.Serialization 解析嵌套的 JSON
【发布时间】:2019-08-20 02:25:08
【问题描述】:

我一直在玩 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:你会推荐改造吗(因为它更老,也许更成熟)?

【问题讨论】:

    标签: json parsing kotlin kotlinx.serialization


    【解决方案1】:
    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)
    }
    

    【讨论】:

    • 是的,我还没有找到更好的灵丹妙药。看起来与 JSON 完全一样的东西,并且可以很好地描述它。这可能是最好的。然后,我脑海中闪过一个问题:也许所有的 cmets 都是对的,而 GSON 也一样好?...
    【解决方案2】:
    @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
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-28
      • 2017-08-03
      • 2018-10-06
      • 2013-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多