你想将你的Data class序列化为Json或者反之,应该很简单,Json这个东西出来已经很久了。 在Android开发中或者说传统的Java开发中,这种任务通常交由一个外部库来完成,这个库通常来说都是谷歌的Gson,但近来随着带有null aware特性的Kotlin语言的推出,用这个库的话就缺少了点优雅。 当然除了Gson还有其它的库可以用(如:Moshi),至于Kotlin本身,自从1.3版本后,它提供了自己的Json序列化和反序列化方式(也支持protoBuf)。
配置
Kotlin自己的方法是一个通过一个具有运行时依赖性的编译器插件,需要修改一下Build.gradle文件,之后就很简单了。
[...]
apply plugin: 'kotlinx-serialization' //1
[...]
dependencies {
implementation "org.jetbrains.kotlinx:kotlinx-serialization-runtime:0.20.0" //2
[...]
}
查看官方文档浏览最新的版本
使用方法
在你的Data类中添加@Serializabe注解,普通的类也是可以加这个注解的,只不过有更多的限制。
@Serializable
data class MyThing(
val data: List<Data>,
val success: Boolean
) {
@Serializable
data class Data(val balance: String)
}
注意如果你的Data类里面用到另一个Data类,则该类也要添加@Serializable注解
序列化和反序列化
很简单,如下 Json字符串转成Data类
val myThing: MyThing = Json.parse(MyThing.serializer(), myThingInJsonText)
Data类转Json
val myThingInJsonText: String = Json.stringify(MyThing.serializer(), myThing)
上面用到的静态对象Json提供了序列化的默认配置,根据官方文档,这个配置是合理的,但不能保证永远不会改变。因此,为了避免令人不快的意外,您可以使用稳定的配置获取实例,以保证今天有效的任何东西明天都能正常工作。查看文档了解更多详细信息。
val json = Json(JsonConfiguration.Stable)
json.parse(.....)
json.stringfy(.....)
忽略和可选字段
通常会有可选字段的需求,比如序列化的时候忽略某些字段,通过给某个字段设定一个默认值即可将该字段变成可选的。
@Serializable
data class MyThing(
val data: List<Data>,
val success: Boolean = false
) {
@Serializable
data class Data(val balance: String)
}
要忽略一个字段,仅需添加@Transient注解
@Serializable
data class MyThing(
val data: List<Data>,
@Transient
val success: Boolean
) {
@