2012-06-05 66 views
2

我在寫一個函數,它使用Gson將Java對象序列化爲Json。使用Gson序列化Java對象的字段對象

我的問題是,它只序列化我的類的原始字段,但不是對象字段。例如。我有兩個類,如:

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

有'tc2'是'null'以外的東西。在你的例子中沒有任何東西需要編碼。 –

回答

3

領域被忽略,因爲它是null。從documentation

是在GSON實現是空對象字段被忽略的默認行爲。這允許更緊湊的輸出格式;但是,當JSON格式轉換回Java時,客戶端必須爲這些字段定義默認值。

這裏是你將如何配置GSON實例輸出空:

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

如果設置tc.tc2null以外的值,你應該看到在輸出文件中的字段。

2

有了您的具體的例子,添加一個構造函數,這將使TC2的新實例:

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

,並看看是否有幫助。如果在您的真實代碼中,與TestClass2相似的類也具有參考類,請同時創建它們的新實例

2

在Java中,對象字段默認情況下未初始化,這意味着tc2字段將爲null,除非你把它設置成某種東西。 Gson默認忽略空字段,因此不會序列化它。

您可以在構造函數中初始化該字段,就像其他答案正確地說的那樣。或者你也可以初始化它做以下操作:

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