Kotlin與Gson與Moshi
Gson在Kotlin中的問題
Kotlin的Data Classes
和非空類型
很好用,Gson解析庫也很好用,但是當(dāng)他們兩個結(jié)合起來時就非常的糟糕……
假設(shè)服務(wù)器某個api會給我們返回這樣的json,它只有兩個參數(shù),但是卻可能出現(xiàn)非常多種情況:
null
{}
{"strValue":"default"}
{"intValue":2}
{"intValue"=2,"strValue"=null}
{"intValue"=2,"strValue"="default"}
為了App的穩(wěn)定性,我們必須將以上情況都考慮到,不能因為服務(wù)器的問題讓我們app莫名奇妙的崩潰,即使你們后臺同事跟你說不可能出現(xiàn)這樣的json也不行,任何時候都不要相信json數(shù)據(jù)的完整性和正確性。
如果我們將data class定義成這樣,然后使用Gson解析:
data class SomeData(
val intValue: Int,
val strValue: String
)
上面全部json都能解析成功,這就導(dǎo)致了我們聲明的非空類型
指向了null,最終肯定觸發(fā)空指針異常。
如果給data class的屬性都賦予默認(rèn)值:
data class SomeData(
val intValue: Int = 0,
val strValue: String = "default value"
)
上面全部json都能解析成功,但是第五種情況會讓strValue
覆蓋默認(rèn)值變?yōu)閚ull,最終還是導(dǎo)致非空類型
指向了null。
所以使用Gson解析時,我們能信任的data class只有下面這種,將所有字段設(shè)為可空類型
。
data class SomeData(
val intValue: Int?,
val strValue: String?
)
希望是什么樣的
data class SomeData(
val intValue: Int,
val strValue: String
)
我希望上面的intValue和strValue在沒有值{}
或為空null
時就給我拋出解析異常,除非我將他們定義為nullable
。
而Moshi正好能滿足這樣的要求
Moshi
擴(kuò)展閱讀: 官方文檔 或 新一代Json解析庫Moshi使用及原理解析
- kotlin支持(空安全)
- square出品,可配合Retrofit使用
- 支持反射or注解器兩種方式,并且可以混用(android上推薦只使用注解器方式)
導(dǎo)入:
implementation "com.squareup.moshi:moshi:$moshiVersion"
kapt "com.squareup.moshi:moshi-kotlin-codegen:$moshiVersion"
kaptTest "com.squareup.moshi:moshi-kotlin-codegen:$moshiVersion" // 測試