假设你有这样的数据类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也警告它,因为它认为不必要的空检查
答案 0 :(得分:2)
您可以使用自定义JsonDeserializer
来验证由@RequiredField
注释的字段,并在其为空时自动抛出异常。
如何做到这一点,你可以在这里找到:Gson optional and required fields