【发布时间】: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?)
id 和 name 字段是必需的,电话 字段是可选的
所以这个模型期望的适当的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