- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 Gson 2.4。
Gson
有一个标志是 null 值应该被序列化还是省略(默认)。当我从省略空值的 Gson
创建一个 TypeAdapter
并通过 TypeAdapter
序列化一个对象时,这个标志被忽略,与 Javadoc 相矛盾:
Type adapters should be prepared to read null from the stream and write it to the stream. (...) If your Gson instance has been configured to GsonBuilder.serializeNulls(), these nulls will be written to the final document. Otherwise the value (and the corresponding name when writing to a JSON object) will be omitted automatically. In either case your type adapter must handle null.
这是一个演示问题的测试:
import com.google.gson.Gson;
public class Test {
private String name;
public static void main(String[] args) throws Exception {
Test object = new Test();
Gson gson = new Gson(); // serializeNulls is off by default
System.out.println(gson.toJson(object));
System.out.println(gson.getAdapter(Test.class).toJson(object));
}
}
这打印:
{}
{"name":null}
我预计第二行是 {}
。
这是一个错误还是我误读了文档?在这两种情况下:在通过 TypeAdapter
进行序列化时是否有忽略空值的解决方法?
最佳答案
TypeAdapter
不执行实际的原始序列化。它遵循在其 write
方法中接收的 JsonWriter
。所以对 null
的实际检查是在 JsonWriter
的各种 name
/value
调用中完成的(对于 JSON 对象).
JsonWriter
维护一个 serializeNulls
标志(以及其他标志)。当使用 Gson#toJson
时,Gson
对象将创建一个新的 JsonWriter
并用它自己的覆盖它的 serializeNulls
值并将 JsonWriter
传递给它决定使用的任何 TypeAdapter
。
在第二种情况下,TypeAdapter#toJson
调用正在创建一个具有默认值的新 JsonWriter
。 JsonWriter#setSerializeNulls
的 javadoc州
Sets whether object members are serialized when their value is null. This has no impact on array elements. The default is
true
.
这就是您看到的行为。
您可以创建自己的 JsonWriter
并对其进行适当配置,然后将其传递给重载的 toJson(Writer, T)
方法。
我认为 javadoc 声明适用于通过 Gson
对象使用 TypeAdapter
对象。
关于java - Gson TypeAdapter 和 serializeNulls,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33503732/
我正在使用 Gson 2.4。 Gson 有一个标志是 null 值应该被序列化还是省略(默认)。当我从省略空值的 Gson 创建一个 TypeAdapter 并通过 TypeAdapter 序列化一
我将 Gson 与 Retrofit 一起使用,我遇到了一个需要序列化单个空字段的情况,但我无法为 Gson 打开全局 serializeNulls() 标志,因为它会破坏我的其余代码。有谁知道如何做
我是一名优秀的程序员,十分优秀!