13.1 Kotlinx serialization

Pre vytváranie a parsovanie JSON do a z Kotlin objektov existuje viacero ciest. Viacero z nich je naviazaných na JVM (Java Virtual Machine), preto si teraz ukážeme multiplatformové riešenie pomocou Kotlinx serialization.

Knižnicu pre kotlinx serialization som už spomínal pri navigácii v JetPack Compose. Poďme sa ale pozrieť na importovanie tejto knižnice. V súbore app/build.gradle.kts pridáme gradle plugin a závislosť:

plugins {
    kotlin("plugin.serialization") version "2.4.10"
}

dependencies {
    implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.11.0")
}

Túto knižnicu potom môžeme použiť pre priame parsovanie JSON do Kotlin objektov a naopak. Najprv si definujeme serializovateľné dátové triedy:

@Serializable
data class Classroom(
    val classroomId: Int,
    val name: String,
    val teachers: List<Teacher>
)

@Serializable
data class Teacher(
    val teacherId: Int,
    val name: String,
)

val classroom = Classroom(
    classroomId = 1,
    name = "Classroom 1",
    teachers = listOf(
        Teacher(teacherId = 1, name = "Teacher 1"),
        Teacher(teacherId = 2, name = "Teacher 2"),
    ),
)

Ak si z tejto triedy vytvoríme objekt, vieme ho previesť na JSON String pomocou Json.encodeToString:

val classroom = Classroom(
    classroomId = 1,
    name = "Classroom 1",
    teachers = listOf(
        Teacher(teacherId = 1, name = "Teacher 1"),
        Teacher(teacherId = 2, name = "Teacher 2"),
    ),
)

println(Json.encodeToString(classroom))

// output: {"classroomId":1,"name":"Classroom 1","teachers":[{"teacherId":1,"name":"Teacher 1"},{"teacherId":2,"name":"Teacher 2"}]}

A naopak, pomocou Json.decodeFromString môžeme JSON String previesť na Kotlin objekt:

val example = """
    {
        "classroomId": 1,
        "name": "Classroom 1",
        "teachers" : [
            {"teacherId": 1,"name": "Teacher 1"},
            {"teacherId": 2,"name": "Teacher 2"}
        ]
    }
"""

println(Json.decodeFromString<Classroom>(example))

// output: Classroom(classroomId=1, name=Classroom 1, teachers=[Teacher(teacherId=1, name=Teacher 1), Teacher(teacherId=2, name=Teacher 2)])

Praktické použitie

V praxi väčšinou priamo nepoužívame Json.encodeToString alebo Json.decodeFromString. Ak totiž pracujeme s JSON, tak ide väčšinou o prácu s REST API. A pre prácu s REST API používame pomocné knižnice. Tie používajú serializáciu a deserializáciu na pozadí.

Existujú ale výnimky, ktorým sa obvykle vyhýbam:

  1. ak si potrebuješ uložiť alebo prečítať zložitejší objekt z/do databázy alebo úložiska telefónu
  2. ak máš predgenerované dáta vo formáte JSON uložené v assetoch (napríklad nejaká konfigurácia aplikácie)