Обработка JSON в Kotlin: обзор библиотек и практические примеры
JSON (JavaScript Object Notation) остаётся одним из самых популярных форматов для обмена данными между клиентом и сервером. В языке Kotlin, который активно используется для разработки Android-приложений и серверных решений, существует несколько мощных библиотек для работы с JSON. В этой статье мы подробно разберём основные инструменты: kotlinx.serialization, Gson, Moshi и Klaxon. Вы узнаете, как парсить JSON, сериализовать объекты и эффективно обрабатывать данные.
1. kotlinx.serialization — нативный подход от JetBrains
kotlinx.serialization — это официальная библиотека от создателей Kotlin. Её главное преимущество — полная интеграция с системой типов языка и поддержка мультиплатформенности (KMM). Для работы потребуется подключить плагин в 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
import kotlinx.serialization.json.Json
@Serializable
data class User(val id: Int, val name: String, val email: String)
fun main() {
val jsonString = """{"id":1,"name":"Анна","email":"anna@example.com"}"""
// Десериализация
val user = Json.decodeFromString<User>(jsonString)
println("Пользователь: ${user.name}, email: ${user.email}")
// Сериализация
val output = Json.encodeToString(user)
println(output)
}
Особенности:
- Не требует рефлексии (работает на этапе компиляции).
- Поддерживает кастомные сериализаторы и полиморфизм.
- Отлично подходит для Kotlin Multiplatform Mobile.
2. Gson — классика от Google
Библиотека 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 json = """{"id":101,"title":"Ноутбук","price":79990.0}"""
// Парсинг
val product = gson.fromJson(json, Product::class.java)
println("Товар: ${product.title}, цена: ${product.price}")
// Обратная конвертация
val newJson = gson.toJson(product)
println(newJson)
}
Плюсы и минусы:
- + Минимум кода для базовых сценариев.
- + Поддержка аннотаций
@SerializedNameдля маппинга полей. - - Использование рефлексии может снижать производительность.
- - Проблемы с обработкой
nullи generic-типов.
3. Moshi — современная альтернатива от Square
Moshi создавалась как более безопасная и быстрая замена Gson. Она также использует рефлексию, но предоставляет кодогенерацию через аннотацию @JsonClass. Подключение:
dependencies {
implementation("com.squareup.moshi:moshi-kotlin:1.15.0")
ksp("com.squareup.moshi:moshi-kotlin-codegen:1.15.0")
}
Пример использования с кодогенерацией:
import com.squareup.moshi.JsonClass
import com.squareup.moshi.Moshi
@JsonClass(generateAdapter = true)
data class Book(val isbn: String, val author: String, val year: Int)
fun main() {
val moshi = Moshi.Builder().build()
val adapter = moshi.adapter(Book::class.java)
val json = """{"isbn":"978-5-17-123456-7","author":"Лев Толстой","year":2023}"""
val book = adapter.fromJson(json)!!
println("Книга: ${book.author} — ${book.isbn}")
val backToJson = adapter.toJson(book)
println(backToJson)
}
Преимущества:
- Безопасность типов на этапе компиляции (при использовании кодогенерации).
- Встроенная поддержка Kotlin-классов и data-классов.
-
Также в библиотеке
Рекомендаций