Введение в работу с 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.