Работа с 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-классами. Без него библиотека не сможет