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

时间:2017-11-14 10:22:41

标签: java gson kotlin json-deserialization

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

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

ID 名称字段,电话字段是可选的
所以这个模型需要适当的json,例如:

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

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

{
   "id": "someHash"      
}

不幸的是,这样的json被成功解析而没有任何错误,因为gson使用 unsafe reflection 并且是为java编写的。因此,非空字段中存储了 null 的kotlin模型已损坏

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

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

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

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

1 个答案:

答案 0 :(得分:2)

您可以使用自定义JsonDeserializer来验证由@RequiredField注释的字段,并在其为空时自动抛出异常。

如何做到这一点,你可以在这里找到:Gson optional and required fields