- 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 将 json 对象转换为字符串。下面是代码 List studs = //from db int count = studs.size();
我是 json 和 gson 的新手。我有个问题。我有一个父类和一个扩展它的子类。我有一个父类列表。有些是 child 类的。当我使用 gson api toJson() 时,我只获取父类中定义的字段
我遇到了问题,App Engine 将 Long/long 值返回为“String”。这是返回的 JSON 文件的一部分: "stringObject" : "This is a string."
我目前正在实现 Hive在我的 FlutterApp 中。不幸的是,这个错误一直弹出: HiveError: There is already a TypeAdapter for typeId 100
我正在使用 Gson 2.4。 Gson 有一个标志是 null 值应该被序列化还是省略(默认)。当我从省略空值的 Gson 创建一个 TypeAdapter 并通过 TypeAdapter 序列化一
我有一个如下所示的 json 字符串: { "SomeStringProperty": { "value":"StringValue"}, "SomeIntProperty": { "value"
我正在尝试序列化一个类,其中一个成员带有自己的 JSON 序列化实现。我不知道如何将它包含在其余属性中。例如 class Foo { String fieldA; String fie
GSON 似乎在使用某种技巧,它查看我的 JavaBeans 的内部字段,而不是使用可公开访问的属性信息。不幸的是,这对我们来说是行不通的,因为我们神奇地创建的 bean 充满了我不希望它存储的私有(
是否有可能实现以下两个目标? 能够委托(delegate)给调用我们的自定义实现的默认 Gson 反序列化器。 不受 JSON 对象中键的不同顺序的影响 下面我描述了两种可能的方法,但只能实现其中一种
我有一个工作代码,其中我的改造客户端可以从 api 检索对象列表(国家/地区)。问题是,如果我曾经检索所有国家,那么 api 使用的参数返回一个 ARRAY,然后当我想查询一个国家时它返回一个 OBJ
我为包含枚举属性的类编写了一个TypeAdapter。这是 write 方法,它对枚举值使用标准 GSON 序列化: @Override public void write(JsonW
我正在尝试用 Kotlin 语言为我的 android 项目实现一些特定的 GSON TypeAdapter。 我面临的问题是无法推断类型的编译错误:Type inference failed: 'T
我想像这样通过 TypeAdapter 模拟一个传递给 Gson 的对象: @RunWith(MockitoJUnitRunner.class) public class SceneExporterT
因此,我正在尝试使用 Gson 和 Retrofit 解决我的自定义 TypeAdapter 遇到的问题。我一直收到 Expected BEGIN_OBJECT but was STRING 错误,但
让我们从分享工作和可复制代码开始(需要谷歌gson包): package mypackage; import com.google.gson.Gson; import com.google.gson.
我很难找到与此特定场景相关的任何内容 我配置了 Spring Boot,并且在其中使用响应式(Reactive) WebClient 来使用 REST Api。我已将其配置为使用 gson,但想知道如
我正在尝试为我正在使用的 JavaFX 类型(不同的属性和可观察值)编写一个 TypeAdapterFactory。对于 ObjectProperty,我可以编写一个 JsonSerializer/D
我见过很多使用自定义 TypeAdapter 的简单示例。最有帮助的是 Class TypeAdapter .但这还没有回答我的问题。 我想自定义对象中单个字段的序列化,并让默认的 Gson 机制处理
我有一个名为游戏的类: public class Game { private String name; private int id; private GameFields[
我正在 Flutter 中学习 Hive db。当我使用 Flutter 包时 pub run build_runner build命令它在其中生成 data.g.dart 文件它有一个错误。 完整的
我是一名优秀的程序员,十分优秀!