gpt4 book ai didi

java - Gson TypeAdapter 和 serializeNulls

转载 作者:行者123 更新时间:2023-11-29 04:56:45 32 4
gpt4 key购买 nike

我正在使用 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 调用正在创建一个具有默认值的新 JsonWriterJsonWriter#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/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com