Разбор вложенного JSON с помощью Kotlinx.Serialization

#json #parsing #kotlin #kotlinx.serialization

#json #синтаксический анализ #kotlin #kotlinx.serialization

Вопрос:

Я играл с 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) произойдет сбой, потому что пара «Космический корабль» и «Метка» не находятся в корне JSON.

Как мне заставить сериализатор ссылаться на поддерево JSON?

P.S: Вы бы порекомендовали вместо этого доработать (потому что он старше и, возможно, более зрелый)?

Ответ №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
}
  

Ответ №2:

 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)
}
  

Комментарии:

1. Да, я не нашел лучшей серебряной пули. Что-то, что будет выглядеть точно так же, как JSON, и красиво его описывать. Это, вероятно, самое лучшее, что может быть. И тогда у меня возникает вопрос: может быть, все комментарии верны, и просто GSON так же хорош?…