使用 Gson 和 Kotlin 的空安全网络响应
Null-safe network response using Gson and Kotlin
假设你有这样的数据-class 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 字段是必需的,phone 字段是可选的
因此,此模型所期望的适当 json,例如:
{
"id": "someHash",
"name": "John Snow"
}
有时服务器可以发送 json 如:
{
"id": "someHash"
}
不幸的是,这样的json被成功解析,没有任何错误,因为gson使用不安全反射并且是为java编写的。因此,结果是 null 存储在 non-null 字段
中的损坏的 kotlin 模型
我想在 json-反序列化层上为该模型提供ide 验证,因为最好在此处收到错误,而不是在应用程序的任何其他部分收到错误,这需要非空字段。
我正在为这个问题寻找任何合适的解决方案。
当然你可以为每个模型提供ide一些明确的验证函数,比如
fun User.validate() {
if (id == null) throw JsonParseException("'id' is null!")
if (name == null) throw JsonParseException("'name' is null!")
}
并在任何地方手动调用它,但它会产生很多样板代码,我们总是尽量避免。并且 ide 发出警告,因为它认为不必要的空检查
您可以使用自定义 JsonDeserializer
来验证由 @RequiredField
之类注释的字段,如果它为空则自动抛出异常。
您可以在此处找到操作方法:Gson optional and required fields
假设你有这样的数据-class 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 字段是必需的,phone 字段是可选的
因此,此模型所期望的适当 json,例如:
{
"id": "someHash",
"name": "John Snow"
}
有时服务器可以发送 json 如:
{
"id": "someHash"
}
不幸的是,这样的json被成功解析,没有任何错误,因为gson使用不安全反射并且是为java编写的。因此,结果是 null 存储在 non-null 字段
中的损坏的 kotlin 模型我想在 json-反序列化层上为该模型提供ide 验证,因为最好在此处收到错误,而不是在应用程序的任何其他部分收到错误,这需要非空字段。
我正在为这个问题寻找任何合适的解决方案。
当然你可以为每个模型提供ide一些明确的验证函数,比如
fun User.validate() {
if (id == null) throw JsonParseException("'id' is null!")
if (name == null) throw JsonParseException("'name' is null!")
}
并在任何地方手动调用它,但它会产生很多样板代码,我们总是尽量避免。并且 ide 发出警告,因为它认为不必要的空检查
您可以使用自定义 JsonDeserializer
来验证由 @RequiredField
之类注释的字段,如果它为空则自动抛出异常。
您可以在此处找到操作方法:Gson optional and required fields