Самый простой способ сериализовать ответ JSON в Android
Вывод из статьи
К концу этой статьи вы узнаете, почему команда Котлина создала новую библиотеку сериализации, несмотря на наличие множества продвинутых библиотек, таких как Moshi и Gson. Наряду с этим вы также узнаете, как использовать собственную библиотеку сериализации, и если вы наберетесь терпения, чтобы дочитать до конца, вы также можете узнать о скрытых функциях собственной сериализации. Прочтите, чтобы узнать о них.
Почему команда Kotlin создала новую библиотеку сериализации
У нас есть много известных и эффективных библиотек сериализации, таких как Moshi от Square и Gson от Google. Но команда Kotlin решила создать совершенно новую собственную библиотеку сериализации для Kotlin. Вопрос в том, почему?
Библиотеки сериализации, такие как Moshi и Gson, представляют собой библиотеки Java, использующие отражения, что хорошо для разработки под Android. Kotlin не ограничивается Android (JVM); он поддерживает разработку на JavaScript (JS) и IOS (нативная). Размышления, черт возьми, не будут работать с Kotlin.js и нативными модулями. Более того, использование отражений в Android - это тоже обратная сторона.
Помимо поддержки нескольких платформ и использования отражений в сериализации, у библиотек сериализации Java есть еще один недостаток: они не поддерживают переменные значений по умолчанию в Kotlin. Чтобы лучше понять это, давайте начнем с простого класса данных, как показано ниже:
data class SimpleExample(val data : String, var optionalData : String = "empty")
Когда мы пытаемся проанализировать JSON только с data
node, тогда optionalData
value изменяется на null
вместо присвоения значения по умолчанию empty
as, объявленного в классе данных. Это большая проблема, потому что, когда переменная объявляется без вопросительного знака, компилятор Kotlin гарантирует, что переменная никогда не будет null
, но обычные библиотеки сериализации Java не знают об этом. Этот тип функционального конфликта приводит к неожиданному поведению приложения.
Поэтому команда Kotlin решила создать библиотеку сериализации, которая работает со всеми поддерживаемыми платформами, а также без отражений.
Интеграция
Чтобы использовать библиотеку сериализации Kotlin, мы должны интегрировать как плагин сериализации, так и библиотеку сериализации времени выполнения. Плагин сериализации генерирует код для анализа JSON без использования каких-либо отражений. С другой стороны, библиотека времени выполнения использует этот код для сериализации классов данных.
Чтобы интегрировать подключаемый модуль сериализации, добавьте следующую строку под всеми подключаемыми модулями в верхней части файла build.gradle
уровня приложения.
apply plugin: 'kotlinx-serialization'
Вам также необходимо добавить следующую строку под узлом зависимостей в файле build.gradle
уровня проекта:
classpath "org.jetbrains.kotlin:kotlin-serialization:$kotlin_version"
Затем добавьте следующую строку реализации библиотеки под тегом dependencies в файле build.gradle
уровня приложения:
implementation "org.jetbrains.kotlinx:kotlinx-serialization-runtime:0.20.0"
Как использовать сериализацию Kotlin с классами данных
Сериализацию можно выполнить довольно быстро с помощью этой собственной библиотеки от команды Kotlin. Нам нужно добавить @Serializable
annotation над предполагаемым классом. Посмотри:
@Serializable data class SimpleExample(val data : String, var optionalData : String = "empty")
Это все; вам не нужно аннотировать каждую переменную сериализуемыми метками, как в обычных библиотеках. Это довольно просто. Теперь давайте посмотрим на более реалистичный пример с Retrofit 2.
Модернизация 2 с сериализацией kotlinx
Мы все знакомы с модернизированными адаптерами для RxJava, Coroutines, Moshi и других библиотек, верно? Точно так же сериализация Kotlin также имеет адаптер от JakeWharton, через который мы можем связать ответ на модификацию с кодом сериализации Kotlin.
Чтобы интегрировать эту библиотеку в свой проект, добавьте строку ниже под dependencies
node в build.gradle
файле уровня приложения:
implementation("com.jakewharton.retrofit:retrofit2-kotlinx-serialization-converter:0.5.0")
Пришло время связать адаптер с экземпляром дооснащения. Взгляните на код ниже:
Предположим, что класс результирующих данных помечен меткой @Serializable
, это все, что нам нужно сделать. Об остальном позаботится Kotlin Serialization Converter.
Скрытые возможности
Безопасность во время компиляции
Это когда вы выполняете сложную сериализацию, например, вложили классы в класс данных ответа. Посмотри:
@Serializable data class SimpleExample(val data : String, var optionalData : String = "empty", var complexClass: ComplexClass )
Хорошо, что вы аннотировали класс данных SimpleExample
с помощью @Serializable
, но что, если вы забыли аннотировать ComplexClass
. Приведет ли это к сбою во время выполнения? Или вы сами явно проверяли, аннотированы ли все вложенные классы?
Расслабиться; ни одна из вышеперечисленных катастроф не произойдет, потому что библиотека сериализации Kotlin безопасна во время компиляции, что означает, что она показывает ошибку, если вы не аннотировали ни один из вложенных классов с помощью @Serializable
, независимо от того, насколько глубоко дерево структура идет .
Временные и необязательные аннотации
Временный: аннотируя переменную в классе данных как @Transient
, мы указываем сериализатору полностью игнорировать это поле.
Необязательно: аннотируя переменную в классе данных как @Optional
, мы указываем сериализатору, что эта переменная является необязательной, поэтому не прерывайте процесс, если вы не нашли ее в ответе. . Кроме того, мы можем присвоить значение по умолчанию, как показано ниже.
Эти две аннотации имеют смысл, и я не знаю, как библиотеки Java упустили их.
Бонус
Чтобы узнать больше о Kotlin, прочитайте предыдущие части этой серии Advanced Programming With Kotlin:
- « Расширенное программирование с помощью Kotlin »
- « Расширенное программирование с помощью Kotlin (Часть 2 )»
- « Расширенное программирование с помощью Kotlin (Часть 3 )»
- « Расширенное программирование Android на Kotlin (часть 4) »
Чтобы узнать больше о Kotlin Coroutines и других расширенных функциях Kotlin, прочтите следующие статьи:
- « Kotlin Coroutines, от базового до продвинутого »
- « Асинхронная загрузка данных с новым потоком Kotlin »
- « Изучение коллекций и последовательностей в Котлине »
Прежде чем мы подведем итоги, я хотел бы поблагодарить Леонида Старцева. Я узнал многие концепции, о которых упоминал здесь, из выступления, которое он сделал на KotlinConfig 2019.
Спасибо за чтение.