Самый простой способ сериализовать ответ 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 Coroutines и других расширенных функциях Kotlin, прочтите следующие статьи:

Прежде чем мы подведем итоги, я хотел бы поблагодарить Леонида Старцева. Я узнал многие концепции, о которых упоминал здесь, из выступления, которое он сделал на KotlinConfig 2019.

Спасибо за чтение.