使用 Gson 和 Kotlin 的空安全网络响应

Null-safe network response using Gson and Kotlin

假设你有这样的数据-class pojo,它代表典型的基于 gson 的响应表示来自服务器。

data class User(
        @field:SerializedName("id")
        val id: String,
        @field:SerializedName("name")
        val name: String,
        @field:SerializedName("user_phone")
        val phone: String?)

idname 字段是必需的,phone 字段是可选的
因此,此模型所期望的适当 json,例如:

{
   "id": "someHash",
   "name": "John Snow"
}

有时服务器可以发送 json 如:

{
   "id": "someHash"      
}

不幸的是,这样的json被成功解析,没有任何错误,因为gson使用不安全反射并且是为java编写的。因此,结果是 null 存储在 non-null 字段

中的损坏的 kotlin 模型

我想在 json-反序列化层上为该模型提供ide 验证,因为最好在此处收到错误,而不是在应用程序的任何其他部分收到错误,这需要非空字段。
我正在为这个问题寻找任何合适的解决方案。

当然你可以为每个模型提供ide一些明确的验证函数,比如

fun User.validate() {
    if (id == null) throw JsonParseException("'id' is null!")
    if (name == null) throw JsonParseException("'name' is null!")
}

并在任何地方手动调用它,但它会产生很多样板代码,我们总是尽量避免。并且 ide 发出警告,因为它认为不必要的空检查

您可以使用自定义 JsonDeserializer 来验证由 @RequiredField 之类注释的字段,如果它为空则自动抛出异常。

您可以在此处找到操作方法:Gson optional and required fields