使用Gson序列化Java对象的字段对象

时间:2012-06-05 19:13:10

标签: java gson

我正在编写一个函数,它使用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?

由于

3 个答案:

答案 0 :(得分:3)

该字段被忽略,因为它是null。来自documentation

  

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

     

以下是如何配置Gson实例以输出null:

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

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

答案 1 :(得分:2)

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

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

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

答案 2 :(得分:2)

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

您可以在构造函数中初始化字段,就像其他答案正确地说的那样。或者您也可以执行以下操作来初始化它:

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