Итак, вы хотите быстро конвертировать Data классы в JSON и обратно. Это должно быть довольно легко, ведь JSON существует уже много лет.
В Android (как и Java в целом) эта задача традиционна передана на специальные библиотеки. В прошлом эту роль занимал Gson. Но позже, особенно с null системой Kotlin, библиотека потеряла актуальность.
Существую и другие современные библиотеки (к примеру Moshi). А начиная с версии 1.3 Kotlin предлагает и собственный способ сериализации в JSON и обратно (доступны также другие форматы, вроде protobuf, но о них в другом посте).
Установка
Вариант Kotlin — это плагин с runtime зависимостью.
1 2 3 4 5 6 7 8 9 10 11 |
[...] apply plugin: 'kotlinx-serialization' [...] dependencies { implementation "org.jetbrains.kotlinx:kotlinx-serialization-runtime:0.20.0" [...] } |
1 2 3 4 5 6 7 8 9 10 11 |
buildscript { [...] repositories { jcenter() } dependencies { classpath "org.jetbrains.kotlin:kotlin-serialization:$kotlin_version" [...] } } |
Посмотрите официальную документацию для получения последних версий.
Использование
Подготовьте ваш data класс
Вам нужно добавить аннотации @Serializabe в ваш data класс. Отметьте, что можно аннотировать и обычный класс, но тогда можно столкнуться с ограничениями.
1 2 3 4 5 6 7 8 |
@Serializable data class MyThing( val data: List<Data>, val success: Boolean ) { @Serializable data class Data(val balance: String) } |
Из важного. Если мы сериализуем класс, который ссылается на другие data классы, то и эти «дети» тоже должны быть сериализованы аннотацией @Serializabe.
Сериализация / Десериализация
Конвертация в JSON и обратно довольно проста.
1 |
val myThing: MyThing = Json.parse(MyThing.serializer(), myThingInJsonText) |
1 |
val myThingInJsonText: String = Json.stringify(MyThing.serializer(), myThing) |
Статический объкт Json, к которому мы обращаемся, предоставляет базовую конфигурацию для сериализации. В соответствии с документацией, эта конфигурация разумна (?), но это не гарантирует, что она никогда не будет изменена. И, чтобы избежать неприятных сюрпризов, вы можете делать обращение со стабильной конфигурацией. Это будет гарантировать, что, то, что работает сегодня, будет работать и завтра.
1 2 3 |
val json = Json(JsonConfiguration.Stable) json.parse(.....) json.stringfy(.....) |
Игнорирование и необязательные поля
Часто нам нужны какие-либо необязательные поля. Или поля, которые мы просто не хотим использовать во время сериализации/десериализации. Или для дополнительных параметров со значением по умолчанию, которое будет изменено в зависимости от JSON данных.
1 2 3 4 5 6 7 8 |
@Serializable data class MyThing( val data: List<Data>, val success: Boolean = false ) { @Serializable data class Data(val balance: String) } |
Чтобы игнорировать success, нужно просто добавить аннотацию @Transient.
1 2 3 4 5 6 7 8 9 |
@Serializable data class MyThing( val data: List<Data>, @Transient val success: Boolean ) { @Serializable data class Data(val balance: String) } |
Этот пост лишь затрагивает поверхность темы. Вы можете кастомизировать процесс сериализации как вам угодно. А как конвертировать ваш JSON в data классы посмотрите тут. На этом всё, наслаждайтесь вашей JSON конвертацией.
Пингбэк: Немного о Kotlin Serialization 1.0 и почему он крут – GeekStand