使用 DEFAULT_SERIALIZE_NULLS 值时不会跳过 Retrofit2/Gson 空值

Posted

技术标签:

【中文标题】使用 DEFAULT_SERIALIZE_NULLS 值时不会跳过 Retrofit2/Gson 空值【英文标题】:Retrofit2/ Gson null values are not skipped when DEFAULT_SERIALIZE_NULLS value is used 【发布时间】:2020-05-13 23:10:33 【问题描述】:

我遇到了一些未知错误。这打破了我对 Kotlin 数据类和 Api 响应的零安全假设。

说,我有一个数据类说Person

 data class Person(val name: String) 
    constructor() : this("")

这将生成一个具有默认名称值的对象 Person,即非 null。 早些时候,当我使用带有GsonConverterFactory.create()(作为转换器工厂添加)的默认改造客户端时。在默认模式下,Gson 不会序列化 null 值。但是今天我发现这个字段被序列化为 null。

我在ReflectiveTypeAdapterFactory https://github.com/google/gson/blob/master/gson/src/main/java/com/google/gson/internal/bind/ReflectiveTypeAdapterFactory.java#L206 中验证相同

这里 instance 值具有非空字段,但在读取每个字段 (field.read(in, instance);) 后,它正在分配空值。 我希望在序列化期间跳过空值还是反序列化?


编辑: 看起来它是反序列化空值而不是序列化空值问题。 参考:https://github.com/google/gson/issues/1148

如果有任何细节遗漏或造成混淆,请告诉我。

【问题讨论】:

你能发布相关的JSON吗? 这只是一个示例数据类。看起来在反序列化期间,使用默认 gson 转换器时不会跳过空值。 【参考方案1】:

你必须通过改变类型使 name 参数可以为空;

String

String?

【讨论】:

以上是关于使用 DEFAULT_SERIALIZE_NULLS 值时不会跳过 Retrofit2/Gson 空值的主要内容,如果未能解决你的问题,请参考以下文章

在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?

今目标使用教程 今目标任务使用篇

Qt静态编译时使用OpenSSL有三种方式(不使用,动态使用,静态使用,默认是动态使用)

MySQL db 在按日期排序时使用“使用位置;使用临时;使用文件排序”

使用“使用严格”作为“使用强”的备份

Kettle java脚本组件的使用说明(简单使用升级使用)