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

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

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

Начать курс

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

JSON (JavaScript Object Notation) — это самый популярный формат обмена данными в современных веб-приложениях и API. Если вы начали изучать Kotlin, то рано или поздно столкнетесь с необходимостью преобразовывать JSON-строки в объекты вашего приложения (десериализация или парсинг) и обратно (сериализация).

В этой статье мы разберем основные способы работы с JSON в Kotlin на примере трех популярных библиотек: kotlinx.serialization, Gson и Moshi. Вы узнаете, как быстро начать парсить JSON и сериализовать данные без лишних сложностей.

Что такое парсинг и сериализация JSON?

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

  • Сериализация — это процесс преобразования объекта (например, класса данных Kotlin) в строку формата JSON.
  • Парсинг (десериализация) — это обратный процесс: из JSON-строки мы получаем объект определенного типа.

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

Библиотека kotlinx.serialization (рекомендуемый способ)

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

Установка

Добавьте плагин в файл build.gradle.kts:

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

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

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

Предположим, у нас есть JSON с данными о пользователе:

{
  "name": "Иван",
  "age": 28,
  "email": "ivan@example.com"
}

Создадим data class и пометим его аннотацией @Serializable:

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

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

fun main() {
    val jsonString = """
        {"name": "Иван", "age": 28, "email": "ivan@example.com"}
    """.trimIndent()

    val user = Json.decodeFromString<User>(jsonString)
    println(user) // User(name=Иван, age=28, email=ivan@example.com)
}

Пример: сериализация в JSON

fun main() {
    val user = User(name = "Анна", age = 25, email = "anna@example.com")
    val jsonString = Json.encodeToString(user)
    println(jsonString)
    // {"name":"Анна","age":25,"email":"anna@example.com"}
}

Преимущества: типобезопасность, скорость, отсутствие рефлексии, поддержка nullable-полей, дефолтных значений и вложенных объектов.

Библиотека Gson (от Google)

Gson — одна из старейших и самых популярных библиотек для работы с JSON в экосистеме JVM. Она проста в использовании, но использует рефлексию, что немного медленнее, чем kotlinx.serialization.

Установка

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

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

import com.google.gson.Gson

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

fun main() {
    val gson = Gson()
    val jsonString = """{"id": 101, "title": "Ноутбук", "price": 75000.0}"""

    val product = gson.fromJson(jsonString, Product::class.java)
    println(product) // Product(id=101, title=Ноутбук, price=75000.0)
}

Пример: сериализация в JSON

fun main() {
    val product = Product(id = 202, title = "Мышь", price = 2500.0)
    val jsonString = gson.toJson(product)
    println(jsonString)
    // {"id":202,"title":"Мышь","price":2500.0}
}

Обратите внимание: Gson требует вызова Product::class.java, что может быть неудобно при работе с дженериками. Для списков используйте TypeToken.

Библиотека Moshi (от Square)

Moshi — это современная альтернатива Gson, также от компании Square (создатели Retrofit и OkHttp). Она легковесна, поддерживает Kotlin-адаптеры и работает быстрее Gson.

Установка

dependencies {
    implementation("com.squareup.moshi:moshi:1.15.0")
    implementation("com.squareup.moshi:moshi-kotlin:1.15.0")
}

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

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

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

fun main() {
    val moshi = Moshi.Builder()
        .add(KotlinJsonAdapterFactory())
        .build()

    val jsonString = """{"isbn": "978-5-699-12345-6", "author": "Пушкин", "pages": 320}"""
    val adapter = moshi.adapter(Book::class.java)

    val book = adapter.fromJson(jsonString)
    println(book) // Book(isbn=978-5-699-12345-6, author=Пушкин, pages=320)
}

Пример: сериализация в JSON

fun main() {
    val book = Book(isbn = "978-5-17-098765-4", author = "Толстой", pages = 800)
    val adapter = moshi.adapter(Book::class.java)
    val jsonString = adapter.toJson(book)
    println(jsonString)
    // {"isbn":"978-5-17-098765-4","author":"Толстой","pages":800}
}

Важно: Moshi требует регистрации KotlinJsonAdapterFactory для работы с Kotlin-классами. Без него библиотека не сможет

Блоги

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