Študijné materiály

kotlinx serialization je knižnica od JetBrainsu pre serializáciu a deserializáciu dát v Kotline. Na rozdiel od Gson je typovo bezpečná a generuje kód pri kompilácii.

15.1.1 Nastavenie

V build.gradle.kts pridáme plugin:

plugins {
    kotlin("jvm") version "2.0.21"
    kotlin("plugin.serialization") version "2.0.21"
}

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

15.1.2 Základná serializácia

Označíme triedu anotáciou @Serializable:

import kotlinx.serialization.Serializable
import kotlinx.serialization.json.Json

@Serializable
data class Person(val name: String, val age: Int)

fun main() {
    val person = Person("Janko", 25)

    // Objekt na JSON
    val json = Json.encodeToString(person)
    println(json) // {"name":"Janko","age":25}

    // JSON na objekt
    val parsed = Json.decodeFromString<Person>(json)
    println(parsed) // Person(name=Janko, age=25)
}

15.1.3 Práca s komplexnými štruktúrami

Serializácia funguje aj s zoznamami a mapami:

import kotlinx.serialization.Serializable
import kotlinx.serialization.json.Json

@Serializable
data class Student(val name: String, val grades: List<Int>)

fun main() {
    val students = listOf(
        Student("Janko", listOf(1, 2, 1)),
        Student("Fero", listOf(2, 1, 1))
    )

    val json = Json.encodeToString(students)
    println(json)
    // [{"name":"Janko","grades":[1,2,1]},{"name":"Fero","grades":[2,1,1]}]

    val parsed = Json.decodeFromString<List<Student>>(json)
    println(parsed)
}

15.1.4 Ignorovanie neznámych polí

Pri parsovaní JSON z API sa často stretneme s neznámymi poľami. Nastavíme ignoreUnknownKeys:

val json = Json { ignoreUnknownKeys = true }
val parsed = json.decodeFromString<Person>(jsonString)

@Serializable anotácia funguje aj pre data class, aj pre bežné class.

Úlohy

Úloha 1

Nastav serializačný plugin a závislosť kotlinx-serialization-json v Gradle projekte.

Úloha 2

Označ dátovú triedu Produkt anotáciou @Serializable a serializuj jej objekt do JSON.

Úloha 3

Deserializuj zoznam objektov z JSON, ktorý navyše obsahuje neznáme pole, s použitím ignoreUnknownKeys.