Присвоение JSON ключей переменным в Kotlin: GSON и Data Class
Быстрый ответ
Для преобразования JSON в Data Class Kotlin при помощи GSON, следуйте этим шагам:
- Используйте аннотацию
@SerializedName
чтобы связать атрибуты класса с ключами JSON. - Создайте экземпляр класса
Gson
. - Используйте метод
fromJson
, подав на вход JSON-строку и тип класса.java
.
Вот пример кода:
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 в список зависимостей вашего проекта:
dependencies {
implementation 'com.google.code.gson:gson:2.8.8'
}
Значения параметров по умолчанию и разрешение нулевых значений
Безопасность Kotlin относительно null предоставляет возможность обработки JSON с отсутствующими полями или полями, принимающими значение null. Внутри данных классов можно задавать значения параметрам по умолчанию и допустимые nullable свойства:
data class UserProfile(
@SerializedName("firstName") val name: String = "John Doe",
@SerializedName("careerYears") val years: Int? = null
)
Обработка вложенных объектов JSON
Если вы работаете с многоуровневыми структурами JSON, потребуется обработка вложенных объектов JSON:
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
позволяет с большой точностью настроить процесс сериализации и десериализации:
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
.
val profileJson = gson.toJson(userProfile)
Визуализация
Точно так же, как судномодельщик построил бы корабль внутри бутылки, составляя его по частям, мы собираем наши Data Class из JSON шаг за шагом:
JSON (📦): { "name": "SS Kotlin", "length": "100m" }
С помощью инструмента GSON мы распаковываем JSON 📦 и создаём Data Class Корабля (🚢) внутри бутылки 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):
Бутылка Kotlin 🍾: 🚢 | "SS Kotlin", "100m" |
Обобщения и TypeToken в JSON
При работе с обобщёнными типами в GSON необходимо воспользоваться TypeToken:
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 наглядной и приятной.
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.
Полезные материалы
- GitHub – google/gson – Исследуйте исходный код и внесите свой вклад в проект Gson на GitHub.
- Сериализация | Документация Kotlin – Ознакомьтесь с использованием Gson для обработки JSON на примерах из официальной документации Kotlin.
- TypeAdapter – gson 2.10.1 javadoc – Изучите возможности Gson TypeAdapter для выполнения задач с пользовательской сериализацией.
- Moshi vs Gson – Сравнение библиотек для обработки JSON в Kotlin – Сравнение библиотек Moshi и Gson поможет вам сделать выбор между ними для использования в проектах на Kotlin.
- JSON to Dart – Этот инструмент позволяет преобразовывать JSON в классы данных Dart, что может быть полезно и для Kotlin.