我正在使用Gson 2.4。
Gson
有一个标志,是否应该序列化或省略空值(默认值)。
当我从TypeAdapter
创建Gson
时省略空值并通过TypeAdapter
序列化对象,则忽略此标志,与Javadoc相矛盾:
应准备类型适配器以从流中读取null 把它写到流中。 (...)如果你的Gson 实例已配置为GsonBuilder.serializeNulls(),这些 nulls将被写入最终文档。 否则价值(和 写入JSON对象时的相应名称将被省略 自动。在任何一种情况下,您的类型适配器必须处理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
进行序列化时是否有一种解决方法可以省略空值?
答案 0 :(得分:3)
TypeAdapter
不执行实际的原始序列化。它推迟到JsonWriter
方法中收到的write
。因此null
的实际检查是在JsonWriter
的各种name
/ value
调用中完成的(对于JSON对象)。
JsonWriter
维护serializeNulls
标志(以及其他标志)。使用Gson#toJson
时,Gson
对象会创建一个新的JsonWriter
,并用自己的serializeNulls
覆盖它,并将JsonWriter
传递给TypeAdapter
TypeAdapter#toJson
它决定使用。
在第二种情况下,JsonWriter
调用正在使用默认值创建新的true
。 JsonWriter#setSerializeNulls
个州的javadoc
设置对象成员的值是否为null时是否序列化。 这对数组元素没有影响。 默认值为
JsonWriter
。
这就是你看到的行为。
您可以创建自己的TypeAdapter
并对其进行适当配置,然后将其传递给重载的toJson(Writer, T)
方法。
我认为javadoc语句适用于通过Gson
个对象使用dirty()
个对象。