Присвоение JSON ключей переменным в Kotlin: GSON и Data Class

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Для преобразования JSON в Data Class Kotlin при помощи GSON, следуйте этим шагам:

  1. Используйте аннотацию @SerializedName чтобы связать атрибуты класса с ключами JSON.
  2. Создайте экземпляр класса Gson.
  3. Используйте метод fromJson, подав на вход JSON-строку и тип класса .java.

Вот пример кода:

kotlin
Скопировать код
import com.google.gson.annotations.SerializedName
import com.google.gson.Gson

data class UserProfile(
    @SerializedName("firstName") val name: String,
    @SerializedName("careerYears") val years: Int
)

val gson = Gson()
val jsonInput = """{"firstName": "Java", "careerYears": 25}"""
val profile: UserProfile = gson.fromJson(jsonInput, UserProfile::class.java)

Не забудьте внести GSON в список зависимостей вашего проекта:

gradle
Скопировать код
dependencies {
    implementation 'com.google.code.gson:gson:2.8.8'
}
Кинга Идем в IT: пошаговый план для смены профессии

Значения параметров по умолчанию и разрешение нулевых значений

Безопасность Kotlin относительно null предоставляет возможность обработки JSON с отсутствующими полями или полями, принимающими значение null. Внутри данных классов можно задавать значения параметрам по умолчанию и допустимые nullable свойства:

kotlin
Скопировать код
data class UserProfile(
    @SerializedName("firstName") val name: String = "John Doe",
    @SerializedName("careerYears") val years: Int? = null
)

Обработка вложенных объектов JSON

Если вы работаете с многоуровневыми структурами JSON, потребуется обработка вложенных объектов JSON:

kotlin
Скопировать код
data class Address(
    @SerializedName("street") val street: String,
    @SerializedName("city") val city: String
)

data class UserProfile(
    @SerializedName("firstName") val name: String,
    @SerializedName("careerYears") val years: Int,
    @SerializedName("address") val address: Address
)

Управление сериализацией с помощью @Expose

Одновременное использование аннотаций @Expose и @SerializedName позволяет с большой точностью настроить процесс сериализации и десериализации:

kotlin
Скопировать код
import com.google.gson.annotations.Expose

data class UserProfile(
    @Expose @SerializedName("firstName") val name: String,
    @Expose(serialize = false) @SerializedName("careerYears") val years: Int
)

val userProfile = UserProfile("Java", 25)
val jsonOutput = gson.toJson(userProfile) // {"firstName": "Java"}

Для преобразования Data Class Kotlin обратно в JSON также используйте метод Gson.toJson.

kotlin
Скопировать код
val profileJson = gson.toJson(userProfile)

Визуализация

Точно так же, как судномодельщик построил бы корабль внутри бутылки, составляя его по частям, мы собираем наши Data Class из JSON шаг за шагом:

Markdown
Скопировать код
JSON (📦): { "name": "SS Kotlin", "length": "100m" }

С помощью инструмента GSON мы распаковываем JSON 📦 и создаём Data Class Корабля (🚢) внутри бутылки Kotlin 🍾:

kotlin
Скопировать код
data class Ship(@SerializedName("name") val name: String, @SerializedName("length") val length: String)

val gson = Gson()
val ship: Ship = gson.fromJson(json, Ship::class.java)

По окончании сборки корабль (Data Class) помещается внутрь бутылки (runtime Kotlin):

Markdown
Скопировать код
Бутылка Kotlin 🍾: 🚢 | "SS Kotlin", "100m" |

Обобщения и TypeToken в JSON

При работе с обобщёнными типами в GSON необходимо воспользоваться TypeToken:

kotlin
Скопировать код
import com.google.gson.reflect.TypeToken
import java.lang.reflect.Type

data class ApiResponse<T>(
    @SerializedName("data") val data: T
)

val jsonString = """{"data": [{"firstName": "Java", "careerYears": 25}, ...]}"""

val type: Type = object : TypeToken<ApiResponse<List<UserProfile>>>() {}.type
val response: ApiResponse<List<UserProfile>> = gson.fromJson(jsonString, type)

Возможности Kotlin для развлечения

Расширенные функции Kotlin и инлайн-функции с реифицированными типами могут сделать обработку JSON наглядной и приятной.

kotlin
Скопировать код
inline fun <reified T> Gson.fromJson(json: String): T = this.fromJson(json, T::class.java)

val userProfile: UserProfile = gson.fromJson(jsonInput)

Бережная работа с именованием

Тщательная работа с именами сущностей в классе данных подчёркивает чёткость и последовательность, вслед за дизайн-философией Kotlin, обеспечивая простоту и надёжность кода при разборе JSON.

Сочетание версий "тигриным прыжком"

Будьте осторожны при выборе версии! Убедитесь, что ваша версия Gson совместима с версией Android Studio и Kotlin.

Полезные материалы

  1. GitHub – google/gson – Исследуйте исходный код и внесите свой вклад в проект Gson на GitHub.
  2. Сериализация | Документация Kotlin – Ознакомьтесь с использованием Gson для обработки JSON на примерах из официальной документации Kotlin.
  3. TypeAdapter – gson 2.10.1 javadoc – Изучите возможности Gson TypeAdapter для выполнения задач с пользовательской сериализацией.
  4. Moshi vs Gson – Сравнение библиотек для обработки JSON в Kotlin – Сравнение библиотек Moshi и Gson поможет вам сделать выбор между ними для использования в проектах на Kotlin.
  5. JSON to Dart – Этот инструмент позволяет преобразовывать JSON в классы данных Dart, что может быть полезно и для Kotlin.