Всем привет! Я тут совсем недавно для работы с JSON начал использовать именно эту библиотеку. Сначала вместе с GSON, который использовал довольно долго, а теперь и отдельно. И вместе с Kotlin она показала себя очень хорошо.
Когда я о ней только узнал я даже переводил небольшой гайд по сериализации, но он уже не факт что актуален. Тогда была немного другая версия, ведь релиз официальный был только пару дней назад.
Думаю уже понятно, что предпочтение я отдал именно библиотеке котлина. Но изначально к поиску замены меня подтолкнул тот факт, что гугловская библиотека непростительно устарела, особенно если учитывать принесенные котлином нововведения. Да и просто новые решения куда проще и удобнее, как я уже узнал уже сейчас.
И в этой статье я просто хочу рассказать немного о том, почему мне так понравилась новая библиотека. И почему я буду использовать именно её. Примеры возьму из материала в честь релиза библиотеки.
Простота в применении
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
import kotlinx.serialization.* import kotlinx.serialization.json.* @Serializable data class User(val name: String, val yearOfBirth: Int) fun main() { // Serialization (Kotlin object to JSON string) val data = User("Louis", 1901) val string = Json.encodeToString(data) println(string) // {"name":"Louis","yearOfBirth":1901} // Deserialization (JSON string to Kotlin object) val obj = Json.decodeFromString<User>(string) println(obj) // User(name=Louis, yearOfBirth=1901) } |
Процесс сериализации и десерализации до предела прост. Нам нужен, к примеру, data class, у которого есть аннотация @Serializable. На этом все!
Ожидаемое поведение
Как заявили его создатели: он сделан с учетом типов в Kotlin. А значит для котлина он — самое то. В т.ч. для мультиплатформенного тоже.
Полиморфная сериализация
Эта библиотека полностью дружит с полиморфизмом. И этот пример просто идеально это отображает, и это реально круто!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
@Serializable sealed class Message { abstract val content: String } @Serializable data class BroadcastMessage(override val content: String) : Message() @Serializable data class DirectMessage(override val content: String, val recipient: String) : Message() fun main() { val data: List<Message> = listOf( DirectMessage("Hey, Joe!", "Joe"), BroadcastMessage("Hey, all!") ) val string = Json.encodeToString(data) println(string) // [{"type":"DirectMessage","content":"Hey, Joe!","recipient":"Joe"},{"type":"BroadcastMessage","content":"Hey, all!"}] val obj = Json.decodeFromString<List<Message>>(string) println(obj) // [DirectMessage(content=Hey, Joe!, recipient=Joe), BroadcastMessage(content=Hey, all!)] } |
Высокий уровень кастомизации
Вот тут можно посмотреть доступные модификаторы. Среди них есть: красивый вывод, игнорирования отсутствующих в объекте переменных (если они есть в json), или игнорирование дефолтных значений, если они есть. Вот один из примеров:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
val format = Json { prettyPrint = true } @Serializable data class Project(val name: String, val language: String) fun main() { val data = Project("kotlinx.serialization", "Kotlin") println(format.encodeToString(data)) //{ // "name": "kotlinx.serialization", // "language": "Kotlin" //} } |
Перспективы и интеграция
На своём сайте они указали несколько довольно популярный фреймворков с которыми уже совместима их библиотека. И, что не менее интересно, обещают завезти скоро и других сериализаций, а именно: HOCON, ProtoBuf, CBOR, и Properties.
Иными словами, для разработчиков на котлине библиотека реально будет очень полезна. Рекомендую хотя бы попробовать. А на этом всё, спасибо и удачи в разработке.