使用 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有三种方式(不使用,动态使用,静态使用,默认是动态使用)