Разбор JSON-тела в Kotlin
Тело ответа API - это всегда текст. Перед разбором его
удобно сохранить в переменную, даже если строка уже
задана в программе. Кодек читает ключи по именам
свойств data class, в том числе когда
значение само является объектом.
Для блока user объявляют отдельный тип, а
корневой тип ссылается на него полем. Оба класса
помечают @Serializable:
import kotlinx.serialization.Serializable
@Serializable
data class Person(val name: String, val surn: String)
@Serializable
data class ProfileDoc(val user: Person, val city: String)
Готовый фрагмент JSON можно разобрать сразу в
ProfileDoc и обратиться к вложенным полям
через точку:
import kotlinx.serialization.Serializable
import kotlinx.serialization.json.Json
@Serializable
data class Person(val name: String, val surn: String)
@Serializable
data class ProfileDoc(val user: Person, val city: String)
fun main() {
val raw = """
{
"user": {
"name": "john",
"surn": "smit"
},
"city": "London"
}
""".trimIndent()
val doc = Json.decodeFromString<ProfileDoc>(raw)
println(doc.user.name)
println(doc.city)
}
Если в корне лежит массив строк, тип в угловых
скобках указывают как List<String>. Порядок
элементов в Kotlin совпадает с порядком в JSON:
import kotlinx.serialization.json.Json
fun main() {
val raw = """["alpha","beta","gamma"]"""
val tags = Json.decodeFromString<List<String>>(raw)
println(tags.joinToString(","))
}
Дана строка:
val raw = """
{
"user": {
"name": "john",
"surn": "smit"
},
"city": "London"
}
""".trimIndent()
Опишите @Serializable типы для
user и корня. Выведите имя и город
на отдельных строках.