假设您有这样的数据类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使用了不安全的反射并且是为Java编写的。因此,结果将是损坏的kotlin模型,其中 null 存储在非null 字段中
我想在json-deserialization层上对此模型提供验证,因为最好是在那里立即收到错误,而不是在应用程序的任何其他部分接收错误,因为该错误期望非null字段。
我正在寻找解决此问题的任何方法。
当然,您可以为每个模型提供一些明确的验证功能,例如
fun User.validate() {
if (id == null) throw JsonParseException("'id' is null!")
if (name == null) throw JsonParseException("'name' is null!")
}
并在任何地方手动调用它,但是会产生很多样板代码,我们一直在努力避免这样做。并且ide发出警告,因为它认为不必要的null检查
最佳答案
您可以使用自定义的JsonDeserializer
来验证由@RequiredField
之类的注释的字段,并在该字段为null时自动引发异常。
怎么做的,您可以在这里找到:Gson optional and required fields
关于java - 使用Gson和Kotlin的零安全网络响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47283216/