Вложенный объект в Kotlin
JSON умеет вкладывать объекты друг в друга через
вложенные фигурные скобки. В Kotlin для этого
достаточно объявить свойство с типом другого
@Serializable класса.
Адрес и контакт клиента логично разделить: сначала тип для города и индекса, затем тип заказа с полем адреса. Оба класса помечают аннотацией:
import kotlinx.serialization.Serializable
@Serializable
data class GeoPoint(val city: String, val postal: String)
@Serializable
data class ClientOrder(val id: Int, val shipTo: GeoPoint)
Запись в строку собирает один JSON-объект, где
значение shipTo само является объектом
с ключами city и postal:
import kotlinx.serialization.Serializable
import kotlinx.serialization.json.Json
@Serializable
data class GeoPoint(val city: String, val postal: String)
@Serializable
data class ClientOrder(val id: Int, val shipTo: GeoPoint)
fun main() {
val order = ClientOrder(
id = 501,
shipTo = GeoPoint("Oslo", "0150")
)
println(Json.encodeToString(order))
}
Чтение из текста работает в обратном порядке: сначала
разбирается внешний объект, затем вложенный блок
для GeoPoint. Если внутренний тип забыть
пометить @Serializable, компилятор не
сгенерирует кодек для всей цепочки.
Объявите @Serializable DurationSlot
с полями hours и minutes, затем
MeetingPlan с title и
slot типа DurationSlot. Запишите
план с названием "sync" и длительностью
1 час 30 минут в JSON и выведите
строку.
Из текста
{"title":"demo","slot":{"hours":0,"minutes":45}}
восстановите MeetingPlan и выведите
название и суммарные минуты как одно число
45.