Gson TypeAdapter和serializeNulls

时间:2015-11-03 16:05:12

标签: java gson

我正在使用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进行序列化时是否有一种解决方法可以省略空值?

1 个答案:

答案 0 :(得分:3)

TypeAdapter不执行实际的原始序列化。它推迟到JsonWriter方法中收到的write。因此null的实际检查是在JsonWriter的各种name / value调用中完成的(对于JSON对象)。

JsonWriter维护serializeNulls标志(以及其他标志)。使用Gson#toJson时,Gson对象会创建一个新的JsonWriter,并用自己的serializeNulls覆盖它,并将JsonWriter传递给TypeAdapter TypeAdapter#toJson它决定使用。

在第二种情况下,JsonWriter调用正在使用默认值创建新的trueJsonWriter#setSerializeNulls个州的javadoc

  

设置对象成员的值是否为null时是否序列化。   这对数组元素没有影响。 默认值为JsonWriter

这就是你看到的行为。

您可以创建自己的TypeAdapter并对其进行适当配置,然后将其传递给重载的toJson(Writer, T)方法。

我认为javadoc语句适用于通过Gson个对象使用dirty()个对象。