使用Gson和Kotlin进行无漏网络响应

假设你有这样的数据类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使用不安全的reflection ,并为Java编写。 所以作为结果将有损坏kotlin模型与空值存储在非空字段

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

当然,你可以为每个模型提供一些明确的validationfunction

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

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

你可以使用自定义的JsonDeserializer来validation由@RequiredField注解的字段,如果它为null则自动抛出exception。

如何做到这一点,你可以在这里find: Gson可选和必填字段