美文网首页
Kotlin与Gson与Moshi

Kotlin与Gson与Moshi

作者: AItsuki | 来源:发表于2019-12-19 01:08 被阅读0次

    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

          本文链接:https://www.haomeiwen.com/subject/uwbpnctx.html