При любом сетевом взаимодействии мобильное приложение получает данные в формате JSON, и задача разработчика — быстро превратить эту строку в готовые Kotlin-объекты. Библиотека Gson от Google решает эту проблему за секунды. В этом уроке из цикла Android Studio: уроки на Kotlin вы узнаете, как подключить Gson, написать первую модель, сериализовать и десериализовать данные, а также избежать типичных ошибок, связанных с рефлексией и производительностью.
Зачем нужен Gson, когда есть JSONObject
Ручной парсинг через JSONObject и JSONArray требует писать десятки строк для каждого поля. Gson автоматически сопоставляет ключи JSON с полями вашего data-класса, используя рефлексию. Это сокращает код в разы, снижает вероятность опечаток и позволяет сосредоточиться на бизнес-логике. Именно поэтому Gson остаётся популярным выбором, даже несмотря на появление более современных альтернатив.
Подключение Gson к Android-проекту
Первым делом откройте build.gradle.kts на уровне модуля и добавьте зависимость. Поскольку библиотека активно развивается, рекомендуется использовать свежую стабильную версию.
dependencies {
implementation("com.google.code.gson:gson:2.10.1")
}
После синхронизации Gradle библиотека готова к использованию. Для работы с Retrofit отдельно подключается конвертер: implementation("com.squareup.retrofit2:converter-gson:2.9.0"). Он связывает сетевой клиент и Gson в одну цепочку.
Создаём data-класс под структуру JSON
Предположим, сервер возвращает такой ответ:
{
"id": 1,
"title": "Изучаем Kotlin",
"author": "Алексей Петров",
"isPublished": true
}
Создайте Kotlin-класс, поля которого точно соответствуют ключам JSON:
data class Article(
val id: Int,
val title: String,
val author: String,
val isPublished: Boolean
)
Если ключ в JSON называется иначе, чем поле класса, используйте аннотацию @SerializedName:
data class Article(
@SerializedName("article_id") val id: Int,
val title: String,
@SerializedName("author_name") val author: String,
@SerializedName("is_published") val isPublished: Boolean
)
Десериализация: из строки JSON в объект Kotlin
Десериализация — это превращение JSON-строки в готовый экземпляр класса. В Gson для этого используется метод fromJson(). Создавать новый экземпляр Gson() при каждом вызове неэффективно — лучше объявить один объект и переиспользовать его.
val gson = Gson()
val jsonString = """{"id":1,"title":"Изучаем Kotlin","author":"Алексей Петров","isPublished":true}"""
val article: Article = gson.fromJson(jsonString, Article::class.java)
Теперь в переменной article находится готовый объект, и можно обращаться к его полям: article.title, article.author. Никаких ручных проверок и приведений типов.
Сериализация: из Kotlin-объекта в строку JSON
Обратный процесс — сериализация — выполняется методом toJson(). Это полезно, когда нужно отправить данные на сервер или сохранить объект в SharedPreferences.
val newArticle = Article(2, "Основы Android", "Мария Иванова", false)
val jsonOutput: String = gson.toJson(newArticle)
// {"id":2,"title":"Основы Android","author":"Мария Иванова","isPublished":false}
Работа со списками и вложенными объектами
Gson умеет парсить не только одиночные объекты, но и массивы JSON. Если сервер возвращает список, десериализация выглядит так:
val jsonArray = """[{"id":1,"title":"Статья 1"},{"id":2,"title":"Статья 2"}]"""
val listType = object : TypeToken<List<Article>>() {}.type
val articles: List<Article> = gson.fromJson(jsonArray, listType)
Вложенные объекты также обрабатываются автоматически. Например, если модель Article содержит поле author: Author, Gson рекурсивно заполнит и его.
Сравнение Gson с аналогами
На рынке существует несколько популярных библиотек для работы с JSON. Выбор зависит от требований к производительности, безопасности и поддержке Kotlin-фич.
| Библиотека | Механизм | Плюсы | Минусы |
|---|---|---|---|
| Gson | Рефлексия во время выполнения | Простой API, не требует кодогенерации, хорошо изучен | Медленнее аналогов на Android, проблемы с обфускацией и R8, игнорирует значения Kotlin по умолчанию |
| Moshi | Кодогенерация (KSP) или рефлексия | Корректно обрабатывает значения по умолчанию, null-безопасен, легковеснее Gson | Требует настройки адаптеров для сложных случаев |
| Kotlin Serialization | Кодогенерация (плагин компилятора) | Нативный для Kotlin, самый быстрый, строгая типизация, работает в KMP | Требует подключения плагина и аннотации @Serializable |
Если вы только начинаете изучать Android Studio: уроки на Kotlin, Gson — отличная точка входа благодаря своей простоте. По мере роста проекта стоит присмотреться к Moshi или Kotlin Serialization.
Практическое задание в Android Studio
Создайте новый проект с Empty Activity и выполните все шаги из урока:
- Добавьте зависимость Gson в
build.gradle.kts. - Создайте data-класс
Bookс полямиtitle: String,year: Int,available: Boolean. - В функции
onCreateсоздайте JSON-строку, представляющую книгу, и десериализуйте её с помощьюGson().fromJson(). - Выведите название книги в
Log.dи покажите Toast с информацией об успешном парсинге. - Сериализуйте объект обратно в строку и сравните с исходным JSON.
Итог
Сегодняшний урок из цикла Android Studio: уроки на Kotlin научил вас работать с библиотекой Gson. Вы подключили зависимость, создали data-класс с аннотациями @SerializedName, освоили сериализацию и десериализацию как одиночных объектов, так и списков. Теперь вы готовы использовать Gson в связке с Retrofit для обработки сетевых запросов — это фундаментальный навык любого Android-разработчика.