kotlinx.serialization处理Json解析
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
编译器生成序列化代码从而避免反射 - 支持
JSON
,CBOR
,Protobuf
等多种格式 - 可以用于Kotln MPP项目,支持跨平台使用
Kotlinx.serialization
支持的格式很多,0.2.0开始增加了对HOCON
的支持:https://github.com/Kotlin/kotlinx.serialization/blob/master/formats/README.md
Android开发中经常用到Gson
、Jackson
、Moshi
、kotshi
等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
)
- 为序列化对象添加
@Serializable
@SerialName
可以重新定义序列化时的参数名- 如果数据有可能为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
最后比较一下Moshi
和Kotlinx.serialization
,这两个库都是适合在Kotlin使用的序列化库
- KS 的优势是支持 Kotlin 的 Multiplatform,对于需要多平台移植的 Kotlin 代码,显然更合适
- Moshi 的优势是同时兼容 Java ,所以如果你的 Kotlin 代码与 Java 代码混合运行在 Jvm 上面,那么考虑使用 Moshi(Moshi的基本使用)
kotlinx.serialization处理Json解析相关推荐
- 新一代Json解析库Moshi使用及原理解析
概述 Moshi是Square公司在2015年6月开源的有关Json的反序列化及序列化的框架,说到Json,大家应该很快想到Gson,FastJson以及Jackson等著名的开源框架,那为什么还需要 ...
- Unity的Json解析二–写Json文件
本文章由cartzhang编写,转载请注明出处. 所有权利保留. 文章链接:http://blog.csdn.net/cartzhang/article/details/50378805 作者:car ...
- html解释json,json 解析
这种json怎么解析?[ "1", "2", "3", "4" ] 就是个数组,但json格式化居然显示为合理的. [ ...
- codable swift_使用Codable进行Swift JSON解析
codable swift In this tutorial, we'll be discussing the Codable Protocol and its forms in order to p ...
- Java:JSON解析工具-org.json
一.简介 org.json是Java常用的Json解析工具,主要提供JSONObject和JSONArray类,现在就各个类的使用解释如下. 二.准备 1.在使用org.json之前,我们应该先从该网 ...
- C# json解析字符串总是多出双引号_json从立地到成佛
本文原创作者bigsai(同公众号),本文以浅显易懂的方式给大家讲解自己所认知的json,如果有错误或者不准确地方还请大家给出指正,另外本文以关卡课程的方式在博学谷也是免费开放的,大家也可通过关卡方式 ...
- ESP8266 学习 十一 ESP8266 JSON解析
解析JSON格式信息是一个较为繁琐的工作,因此我们将借助解析Arduino – ESP8266平台中解析JSON格式信息的第三方库--ArduionJson库.该库是目前最受好评的解析JSON信息第三 ...
- android Json解析详解
JSON的定义: 一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性.业内主流技术为其提供了完整的解决方案(有点类似于正则表达式 ,获得了当今大部分语 言的支持),从而可以在不同平台间进行数 ...
- json解析:[1]gson解析json
客户端与服务器进行数据交互时,常常需要将数据在服务器端将数据转化成字符串并在客户端对json数据进行解析生成对象.但是用jsonObject和jsonArray解析相对麻烦.利用Gson和阿里的fas ...
- spring boot2 修改默认json解析器Jackson为fastjson
fastjson是阿里出的,尽管近年fasjson爆出过几次严重漏洞,但是平心而论,fastjson的性能的确很有优势,尤其是大数据量时的性能优势,所以fastjson依然是我们的首选:spring ...
最新文章
- PaSS:用于 PacBio 测序的测序模拟器
- 《数学之美》第6章 信息的度量和作用
- MATLAB2013a的license过期的解决办法
- python中subplot是什么意思_python matplotlib中的subplot函数使用详解
- 过滤输入内容中是否含有特殊字符与表情
- List集合的迭代器方法
- opencv 中affine函数实现旋转和平移
- python 协程可以嵌套协程吗_Python线程、协程探究(2)——揭开协程的神秘面纱...
- 天池大赛, Storm
- Windows 8.1 Windows Phone 开发环境安装遇到的问题
- [Leetcode][程序员面试金典][面试题08.03][JAVA][魔术索引][递归][优化]
- 智能家居中语音识别算法研究_语音识别研究获进展
- html中设置data-*属性值 并在js中进行获取属性值
- 落实业务服务管理从基础设施管理做起
- opencv 实现等值线_OpenCV图像增强算法实现(直方图均衡化、拉普拉斯、Log、Gamma)...
- STM32固件库包的下载与安装
- ubuntu关机后自动重启[无法关机]的解决办法
- 从零开始写Python爬虫 --- 1.4 爬取生活大爆炸百度贴吧内容
- 裁判文书App(2020最新版) 逆向过程分析
- java web实现套打,web 如何实现精准打印
热门文章
- 关于iphone设置显示模式为标准模式和放大模式时的区别
- 安卓开发实例(3)装备选择
- python 数据shape的理解
- 咆哮教主网络走红 龅牙哥出台说真相 画皮收视率破新高
- java输入无名粉_05·无名粉店(上)
- amd玄冰400怎么拆图解_给老电脑降降温(把AMD原装散热器换成玄冰400)过程体验...
- 2018的趋势与展望(下)——记罗振宇“时间的朋友2017”跨年演讲
- Android搭建无线调试环境
- 图像处理空间域、变换域、时域和频域的含义理解:spatial VS transforms domain
- windows、ubuntu双系统安装教程