2

我正在编写一个使用 Gson 将 Java 对象序列化为 Json 的函数。

我遇到的问题是它只序列化我的类的原始字段而不是对象字段。例如。我有两个类,例如:

class TestClass {
    public int i = 10;
    public TestClass2 tc2;
}

class TestClass2 {
    public int j = 20;
}

我的测试是:

@Test
public void shouldSerializeSimpleObjectIntoJson() {
    TestClass tc = new TestClass();

    String json = new Gson().toJson(tc);
    System.out.println(json);
}

Json 输出为:

{"i":10}

它不包含 tc2 的字段。

如何配置 Gson 以递归方式将对象编码为 Json?

谢谢

4

3 回答 3

3

该字段被忽略,因为它是null. 从文档中:

Gson 中实现的默认行为是忽略空对象字段。 这允许更紧凑的输出格式;但是,客户端必须为这些字段定义一个默认值,因为 JSON 格式会被转换回其 Java。

以下是配置 Gson 实例以输出 null 的方法:

Gson gson = new GsonBuilder().serializeNulls().create();

如果您设置tc.tc2为 以外的值null,您应该在输出文件中看到它的字段。

于 2012-06-05T19:17:03.983 回答
2

使用您的具体示例,添加一个构造函数,该构造函数将创建一个新的 tc2 实例:

public TestClass()
{
   tc2 = new TestClass2();
}

看看它是否有帮助。如果在您的真实代码中,类似于 TestClass2 的类也有引用类,请创建它们的新实例

于 2012-06-05T19:21:56.327 回答
2

在 Java 中,默认情况下不初始化对象字段,这意味着 tc2 字段将为空,除非您将其设置为某个值。Gson 默认忽略空字段,因此它不会对其进行序列化。

您可以在构造函数中初始化该字段,就像另一个答案正确说的那样。或者您也可以通过以下方式对其进行初始化:

class TestClass {
    public int i = 10;
    public TestClass2 tc2 = new TestClass2();
}
于 2012-06-05T19:46:31.113 回答