【问题标题】:Null-safe network response using Gson and Kotlin使用 Gson 和 Kotlin 的空安全网络响应
【发布时间】:2017-11-14 10:22:41
【问题描述】:

假设你有这样的数据类 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 字段是必需的,电话 字段是可选的
所以这个模型期望的适当的json,例如:

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

有时服务器可以像这样发送json:

{
   "id": "someHash"      
}

不幸的是,这样的 json 解析成功,没有任何错误,因为 gson 使用 unsafe 反射 并且是为 java 编写的。因此,将有损坏的 kotlin 模型,其中 null 存储在 non-null 字段中

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

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

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

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

【问题讨论】:

  • @fisher3421 不,我没有。这个库有解决方案吗?如果可能的话,我想避免额外的依赖

标签: java gson kotlin json-deserialization


【解决方案1】:

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

怎么做,你可以在这里找到:Gson optional and required fields

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-02-24
  • 1970-01-01
  • 1970-01-01
  • 2017-08-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多