Kotlin与Gson与Moshi

Kotlin与Gson与Moshi

Safe Parsing Kotlin Data-classes with Gson

Gson在Kotlin中的问题

Kotlin的Data Classes非空类型很好用,Gson解析库也很好用,但是当他们两个结合起来时就非常的糟糕……

假设服务器某个api会给我们返回这样的json,它只有两个参数,但是却可能出现非常多种情况:

  1. null
  2. {}
  3. {"strValue":"default"}
  4. {"intValue":2}
  5. {"intValue"=2,"strValue"=null}
  6. {"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使用及原理解析

空安全和泛型支持的测试:https://github.com/AItsuki/AndroidSamples/blob/master/moshi/src/test/java/com/aitsuki/sample/moshi/MoshiWithKotlinNullSafeTest.kt

  • 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" // 测试

你可能感兴趣的:(Kotlin与Gson与Moshi)