Работа с JSON в Kotlin: парсинг и сериализация данных

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Введение в работу с JSON в Kotlin

JSON (JavaScript Object Notation) является одним из самых популярных форматов для обмена данными между сервером и клиентом. В современной разработке на Kotlin, будь то Android-приложения или серверные проекты, умение эффективно работать с JSON — обязательный навык. В этой статье мы подробно разберем, как выполнять парсинг и сериализацию JSON в Kotlin, используя наиболее популярные библиотеки: kotlinx.serialization и Gson.

Независимо от того, создаете ли вы REST API, обрабатываете ответы от внешних сервисов или сохраняете локальные настройки, понимание принципов работы с JSON поможет вам писать более чистый и эффективный код.

Основы парсинга JSON в Kotlin

Что такое сериализация и десериализация?

Прежде чем перейти к коду, важно понять два ключевых понятия:

  • Сериализация — преобразование объекта Kotlin (data class, список и т.д.) в JSON-строку.
  • Десериализация (парсинг) — обратный процесс: из JSON-строки создается объект Kotlin.

В Kotlin нет встроенной поддержки JSON, поэтому мы используем сторонние библиотеки. Рассмотрим две самые популярные.

Библиотека kotlinx.serialization

kotlinx.serialization — это официальная библиотека от JetBrains, которая отлично интегрируется с языком Kotlin. Она работает на этапе компиляции, что обеспечивает высокую производительность и безопасность типов.

Подключение библиотеки

Для начала добавьте плагин в build.gradle.kts:

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

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

Определение модели данных

Создадим класс для представления пользователя:

import kotlinx.serialization.Serializable

@Serializable
data class User(
    val name: String,
    val age: Int,
    val email: String? = null, // nullable поле
    val roles: List<String> = emptyList()
)

Аннотация @Serializable сообщает компилятору, что этот класс может быть сериализован.

Сериализация (объект → JSON)

import kotlinx.serialization.encodeToString
import kotlinx.serialization.json.Json

fun main() {
    val user = User(
        name = "Анна",
        age = 28,
        email = "anna@example.com",
        roles = listOf("admin", "user")
    )

    val jsonString = Json.encodeToString(user)
    println(jsonString)
    // {"name":"Анна","age":28,"email":"anna@example.com","roles":["admin","user"]}
}

Десериализация (JSON → объект)

import kotlinx.serialization.decodeFromString

fun main() {
    val json = """{"name":"Иван","age":35,"roles":["user"]}"""
    
    val user = Json.decodeFromString<User>(json)
    println(user.name) // Иван
    println(user.email) // null (не указано в JSON)
}

Настройка Json конфигурации

Вы можете настроить поведение парсера:

val json = Json {
    prettyPrint = true          // красивое форматирование
    ignoreUnknownKeys = true    // игнорировать лишние поля в JSON
    isLenient = true            // разрешить нестрогий парсинг (например, кавычки)
}

val user = json.decodeFromString<User>(jsonString)

Библиотека Gson

Gson от Google — еще одна популярная библиотека, особенно распространенная в Android-разработке.

Подключение Gson

dependencies {
    implementation("com.google.code.gson:gson:2.10.1")
}

Пример использования

import com.google.gson.Gson

data class Product(
    val id: Int,
    val title: String,
    val price: Double
)

fun main() {
    val gson = Gson()

    // Сериализация
    val product = Product(1, "Ноутбук", 75000.0)
    val json = gson.toJson(product)
    println(json) // {"id":1,"title":"Ноутбук","price":75000.0}

    // Десериализация
    val jsonString = """{"id":2,"title":"Мышь","price":1500.0}"""
    val parsedProduct = gson.fromJson(jsonString, Product::class.java)
    println(parsedProduct.title) // Мышь
}

Работа с коллекциями

Для десериализации списков используйте TypeToken:

import com.google.gson.reflect.TypeToken

val jsonArray = """[{"id":1,"title":"A"},{"id":2,"title":"B"}]"""
val type = object : TypeToken<List<Product>>() {}.type
val products: List<Product> = gson.fromJson(jsonArray, type)

Сравнение библиотек: что выбрать?

Критерий kotlinx.serialization Gson
Производительность Высокая (компиляция) Средняя (рефлексия)
Безопасность типов Полная (на этапе компиляции) Частичная (Runtime)
Поддержка Kotlin Нативная, от JetBrains Хорошая, но требует адаптации
Простота использования Требует настройки плагина Простое подключение
Экосистема Android Растет Очень широкая

Рекомендация: Если вы начинаете новый проект на Kotlin (особенно мультиплатформенный), выбирайте kotlinx.serialization. Для поддержки легаси-кода или Android-проектов с Gson — оставляйте Gson.

Продвинутые техники работы с JSON

Блоги

Рекомендаций по книгам