Обработка JSON в Kotlin: библиотеки, парсинг и сериализация

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

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

Начать курс

Обработка JSON в Kotlin: полное руководство

JSON (JavaScript Object Notation) остаётся одним из самых популярных форматов обмена данными в веб-разработке, мобильных приложениях и микросервисах. Kotlin, будучи современным языком для JVM, Android и мультиплатформенных проектов, предлагает несколько мощных инструментов для работы с JSON. В этой статье мы подробно разберём основные библиотеки, их возможности и лучшие практики.

Зачем нужна библиотека для JSON в Kotlin?

Хотя Kotlin работает на JVM и может использовать Java-библиотеки, нативные Kotlin-решения (например, kotlinx.serialization) обеспечивают:

  • Безопасность типов на этапе компиляции
  • Поддержку data-классов и sealed-классов
  • Мультиплатформенность (KMP)
  • Минимальный boilerplate-код

Основные библиотеки для работы с JSON в Kotlin

1. kotlinx.serialization (рекомендуемый)

Это официальная библиотека JetBrains, встроенная в экосистему Kotlin. Она поддерживает мультиплатформенность и не требует рефлексии.

Подключение (Gradle):

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

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

Пример парсинга JSON:

import kotlinx.serialization.*
import kotlinx.serialization.json.*

@Serializable
data class User(
    val id: Int,
    val name: String,
    val email: String,
    @SerialName("is_active") val isActive: Boolean = false
)

fun main() {
    val jsonString = """
        {
            "id": 1,
            "name": "Иван Петров",
            "email": "ivan@example.com",
            "is_active": true
        }
    """.trimIndent()

    val user = Json.decodeFromString<User>(jsonString)
    println("Пользователь: ${user.name}, активен: ${user.isActive}")

    // Сериализация обратно в JSON
    val jsonOutput = Json.encodeToString(user)
    println(jsonOutput)
}

2. Gson (от Google)

Популярная Java-библиотека, которая легко адаптируется под Kotlin. Подходит для простых проектов без мультиплатформенности.

Пример:

import com.google.gson.Gson
import com.google.gson.annotations.SerializedName

data class Product(
    @SerializedName("product_id") val id: Int,
    val title: String,
    val price: Double
)

fun main() {
    val gson = Gson()
    val json = """{"product_id": 101, "title": "Ноутбук", "price": 79999.99}"""
    
    val product = gson.fromJson(json, Product::class.java)
    println("Товар: ${product.title}, цена: ${product.price} руб.")
    
    // Обратная сериализация
    val jsonOut = gson.toJson(product)
    println(jsonOut)
}

3. Moshi (от Square)

Современная альтернатива Gson с лучшей производительностью и поддержкой Kotlin-кодогенерации.

Пример:

import com.squareup.moshi.Moshi
import com.squareup.moshi.kotlin.reflect.KotlinJsonAdapterFactory
import com.squareup.moshi.adapters.PolymorphicJsonAdapterFactory

data class Book(
    val isbn: String,
    val author: String,
    val year: Int
)

fun main() {
    val moshi = Moshi.Builder()
        .add(KotlinJsonAdapterFactory())
        .build()
    
    val adapter = moshi.adapter(Book::class.java)
    
    val json = """{"isbn": "978-5-17-123456-7", "author": "Лев Толстой", "year": 1877}"""
    val book = adapter.fromJson(json)
    println("Книга: ${book?.author} - ISBN: ${book?.isbn}")
}

Сравнение библиотек

  • kotlinx.serialization — лучший выбор для новых проектов, мультиплатформенности и Android. Требует плагина компилятора.
  • Gson — прост в использовании, подходит для быстрых прототипов и legacy-проектов на Java/Kotlin.
  • Moshi — оптимален для высоконагруженных систем, имеет встроенную поддержку null-безопасности Kotlin.

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

Работа с вложенными объектами и списками

@Serializable
data class Order(
    val id: Long,
    val items: List<OrderItem>,
    val customer: Customer
)

@Serializable
data class OrderItem(
    val productId: Int,
    val                    

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