#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 так же хорош?…