java - 使用Gson和Kotlin的零安全网络响应

标签 java gson kotlin json-deserialization

假设您有这样的数据类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/

相关文章:

java - 调用方法时出错 - 尝试部署 Javafx 应用程序时无法启动 JVM

kotlin - 使用 gson 从序列化/反序列化中排除 Kotlin 数据类属性/字段

android - Room Entity 的数据存储正确,但检索为 null

lambda - 是否可以从 lambda 闭包中隐藏变量?

java - 在 Java 中是否可以覆盖 Objects 数组的 'toString'?

java - 我正在运行一个 jar 文件,它显示以下错误

java - GSON - 更新 json 文件

android - 如何在 Kotlin/Arrow.kt 中为生产者 channel 实现 "Railway Pattern"

java - Spring boot Liquibase 基于类路径的迁移文件

java - GSON "Expected BEGIN_OBJECT but was BEGIN_ARRAY"错误