Kotlin与Gson与Moshi
Gson在Kotlin中的问题
Kotlin的Data Classes
和非空类型
很好用,Gson解析库也很好用,但是当他们两个结合起来时就非常的糟糕……
假设服务器某个api会给我们返回这样的json,它只有两个参数,但是却可能出现非常多种情况:
null
{}
{"strValue":"default"}
{"intValue":2}
{"intValue"=2,"strValue"=null}
{"intValue"=2,"strValue"="default"}
为了App的稳定性,我们必须将以上情况都考虑到,不能因为服务器的问题让我们app莫名奇妙的崩溃,即使你们后台同事跟你说不可能出现这样的json也不行,任何时候都不要相信json数据的完整性和正确性。
如果我们将data class定义成这样,然后使用Gson解析:
data class SomeData(
val intValue: Int,
val strValue: String
)
上面全部json都能解析成功,这就导致了我们声明的非空类型
指向了null,最终肯定触发空指针异常。
如果给data class的属性都赋予默认值:
data class SomeData(
val intValue: Int = 0,
val strValue: String = "default value"
)
上面全部json都能解析成功,但是第五种情况会让strValue
覆盖默认值变为null,最终还是导致非空类型
指向了null。
所以使用Gson解析时,我们能信任的data class只有下面这种,将所有字段设为可空类型
。
data class SomeData(
val intValue: Int?,
val strValue: String?
)
希望是什么样的
data class SomeData(
val intValue: Int,
val strValue: String
)
我希望上面的intValue和strValue在没有值{}
或为空null
时就给我抛出解析异常,除非我将他们定义为nullable
。
而Moshi正好能满足这样的要求
Moshi
扩展阅读: 官方文档 或 新一代Json解析库Moshi使用及原理解析
- kotlin支持(空安全)
- square出品,可配合Retrofit使用
- 支持反射or注解器两种方式,并且可以混用(android上推荐只使用注解器方式)
导入:
implementation "com.squareup.moshi:moshi:$moshiVersion"
kapt "com.squareup.moshi:moshi-kotlin-codegen:$moshiVersion"
kaptTest "com.squareup.moshi:moshi-kotlin-codegen:$moshiVersion" // 测试