我正在编写一个函数,它使用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?
由于
答案 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();
}