kotlinx.serialization 是什么?


Kotlin serialization consists of a compiler plugin, that generates visitor code for serializable classes, runtime library with core serialization API and JSON format, and support libraries with
ProtoBuf, CBOR and properties formats.

Kotlin官方的序列化库,具有以下特点:

  • 可以基于@serializable编译器生成序列化代码从而避免反射
  • 支持 JSONCBORProtobuf等多种格式
  • 可以用于Kotln MPP项目,支持跨平台使用

Kotlinx.serialization支持的格式很多,0.2.0开始增加了对HOCON的支持:https://github.com/Kotlin/kotlinx.serialization/blob/master/formats/README.md

Android开发中经常用到GsonJacksonMoshikotshi等Json解析库,全面转向Kotlin开发后,kotlinx.serialization 也是一个很好的选择。

gradle


root的build.gradle

buildscript {ext.kotlin_version = "1.3.70" // 最低v1.3.30以上dependencies {classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"classpath "org.jetbrains.kotlin:kotlin-serialization:$kotlin_version"}
}

module的build.gradle

repositories {jcenter()
}dependencies {implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" // or "kotlin-stdlib-jdk8"implementation "org.jetbrains.kotlinx:kotlinx-serialization-runtime:0.20.0"
}

也可用kts进行gradle配置,如下:

plugins {kotlin("multiplatform") // or kotlin("jvm") or any other kotlin pluginkotlin("plugin.serialization") version "1.3.70"
}
repositories {// artifacts are published to JCenterjcenter()
}dependencies {implementation(kotlin("stdlib", KotlinCompilerVersion.VERSION)) // or "stdlib-jdk8"implementation("org.jetbrains.kotlinx:kotlinx-serialization-runtime:0.20.0") // JVM dependency
}

proguard


proguard-rules.pro

-keepattributes *Annotation*, InnerClasses
-dontnote kotlinx.serialization.SerializationKt
-keep,includedescriptorclasses class com.yourcompany.yourpackage.**$$serializer { *; } # <-- change package name to your app's
-keepclassmembers class com.yourcompany.yourpackage.** { # <-- change package name to your app's*** Companion;
}
-keepclasseswithmembers class com.yourcompany.yourpackage.** { # <-- change package name to your app'skotlinx.serialization.KSerializer serializer(...);
}

如上,就可以在工程中使用kotlinx.serialzation了。

接下实现Json解析的代码

data class


import kotlinx.serialization.*
import kotlinx.serialization.json.*@Serializable // 1
data class Data(val id: Int,@SerialName("user_name") // 2val name: String = "hoge",@SerialName("mail_address")val mailAddress: String? = "" // 3
)
  1. 为序列化对象添加@Serializable
  2. @SerialName 可以重新定义序列化时的参数名
  3. 如果数据有可能为null,则要指定为可空类型,否则序列化时会被赋值null,运行时可能出现NPE

除了以上几个常用注解外,还有@Required等其他注解满足序列化过程的其他需求

config & parse


// sample data
val json = """{"id":0,"user_name":"hoge","mail_address":"aaa@gmail.com"}"""val obj = Json(JsonConfiguration.Stable).parse(Data.serializer(), json)

Json(....)中进行序列化的设置,JsonConfiguration.Stable是缺省设置,可以不显式指定,其定义如下:

companion object {@JvmStaticpublic val Stable = JsonConfiguration(encodeDefaults = true,ignoreUnknownKeys = false,isLenient = false,serializeSpecialFloatingPointValues = false,allowStructuredMapKeys = true,prettyPrint = false,unquotedPrint = false,indent = defaultIndent,useArrayPolymorphism = false,classDiscriminator = defaultDiscriminator)
}

可以通过查看源码了解上面各项目的具体函数以。

Stable的检查比较严格, 如果mail_address不是可空类型,但在解析时数据为空,使用Stable可以在parse时抛出error,避免运行时的NPE。Moshi也提供类似功能,处理Kotlin的空安全( Moshi兼容Kotlin空安全)

当然,也可以自定义JsonConfiguration的内容,例如

// sample data
val json = """{"id":0,"user_name":"hoge"}"""val parsedJson = Json(JsonConfiguration(isLenient = true, // 1ignoreUnknownKeys = true,serializeSpecialFloatingPointValues = true)
).parse(Data.serializer(), json)

上面的配置就不会在在解析时,因为遇到非法Null值而抛出异常,但同时将风险留到了后面。

0.14.0起可以通过下面的方法处理可空的value,更加方便了

// sample data
val json = """{"id":0,"name":"hoge"}"""val obj = Json.nonstrict.parse(Data.serializer(), json)

Moshi VS Kotlinx.serialization


最后比较一下MoshiKotlinx.serialization,这两个库都是适合在Kotlin使用的序列化库

  • KS 的优势是支持 Kotlin 的 Multiplatform,对于需要多平台移植的 Kotlin 代码,显然更合适
  • Moshi 的优势是同时兼容 Java ,所以如果你的 Kotlin 代码与 Java 代码混合运行在 Jvm 上面,那么考虑使用 Moshi(Moshi的基本使用)

kotlinx.serialization处理Json解析相关推荐

  1. 新一代Json解析库Moshi使用及原理解析

    概述 Moshi是Square公司在2015年6月开源的有关Json的反序列化及序列化的框架,说到Json,大家应该很快想到Gson,FastJson以及Jackson等著名的开源框架,那为什么还需要 ...

  2. Unity的Json解析二–写Json文件

    本文章由cartzhang编写,转载请注明出处. 所有权利保留. 文章链接:http://blog.csdn.net/cartzhang/article/details/50378805 作者:car ...

  3. html解释json,json 解析

    这种json怎么解析?[ "1", "2", "3", "4" ] 就是个数组,但json格式化居然显示为合理的. [ ...

  4. codable swift_使用Codable进行Swift JSON解析

    codable swift In this tutorial, we'll be discussing the Codable Protocol and its forms in order to p ...

  5. Java:JSON解析工具-org.json

    一.简介 org.json是Java常用的Json解析工具,主要提供JSONObject和JSONArray类,现在就各个类的使用解释如下. 二.准备 1.在使用org.json之前,我们应该先从该网 ...

  6. C# json解析字符串总是多出双引号_json从立地到成佛

    本文原创作者bigsai(同公众号),本文以浅显易懂的方式给大家讲解自己所认知的json,如果有错误或者不准确地方还请大家给出指正,另外本文以关卡课程的方式在博学谷也是免费开放的,大家也可通过关卡方式 ...

  7. ESP8266 学习 十一 ESP8266 JSON解析

    解析JSON格式信息是一个较为繁琐的工作,因此我们将借助解析Arduino – ESP8266平台中解析JSON格式信息的第三方库--ArduionJson库.该库是目前最受好评的解析JSON信息第三 ...

  8. android Json解析详解

    JSON的定义: 一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性.业内主流技术为其提供了完整的解决方案(有点类似于正则表达式 ,获得了当今大部分语 言的支持),从而可以在不同平台间进行数 ...

  9. json解析:[1]gson解析json

    客户端与服务器进行数据交互时,常常需要将数据在服务器端将数据转化成字符串并在客户端对json数据进行解析生成对象.但是用jsonObject和jsonArray解析相对麻烦.利用Gson和阿里的fas ...

  10. spring boot2 修改默认json解析器Jackson为fastjson

    fastjson是阿里出的,尽管近年fasjson爆出过几次严重漏洞,但是平心而论,fastjson的性能的确很有优势,尤其是大数据量时的性能优势,所以fastjson依然是我们的首选:spring ...

最新文章

  1. PaSS:用于 PacBio 测序的测序模拟器
  2. 《数学之美》第6章 信息的度量和作用
  3. MATLAB2013a的license过期的解决办法
  4. python中subplot是什么意思_python matplotlib中的subplot函数使用详解
  5. 过滤输入内容中是否含有特殊字符与表情
  6. List集合的迭代器方法
  7. opencv 中affine函数实现旋转和平移
  8. python 协程可以嵌套协程吗_Python线程、协程探究(2)——揭开协程的神秘面纱...
  9. 天池大赛, Storm
  10. Windows 8.1 Windows Phone 开发环境安装遇到的问题
  11. [Leetcode][程序员面试金典][面试题08.03][JAVA][魔术索引][递归][优化]
  12. 智能家居中语音识别算法研究_语音识别研究获进展
  13. html中设置data-*属性值 并在js中进行获取属性值
  14. 落实业务服务管理从基础设施管理做起
  15. opencv 实现等值线_OpenCV图像增强算法实现(直方图均衡化、拉普拉斯、Log、Gamma)...
  16. STM32固件库包的下载与安装
  17. ubuntu关机后自动重启[无法关机]的解决办法
  18. 从零开始写Python爬虫 --- 1.4 爬取生活大爆炸百度贴吧内容
  19. 裁判文书App(2020最新版) 逆向过程分析
  20. java web实现套打,web 如何实现精准打印

热门文章

  1. 关于iphone设置显示模式为标准模式和放大模式时的区别
  2. 安卓开发实例(3)装备选择
  3. python 数据shape的理解
  4. 咆哮教主网络走红 龅牙哥出台说真相 画皮收视率破新高
  5. java输入无名粉_05·无名粉店(上)
  6. amd玄冰400怎么拆图解_给老电脑降降温(把AMD原装散热器换成玄冰400)过程体验...
  7. 2018的趋势与展望(下)——记罗振宇“时间的朋友2017”跨年演讲
  8. Android搭建无线调试环境
  9. 图像处理空间域、变换域、时域和频域的含义理解:spatial VS transforms domain
  10. windows、ubuntu双系统安装教程