2013-10-27 69 views
3

我想將一個複雜的Java對象轉換爲JSON。但我無法這樣做。 我正在使用Java泛型。如何將複雜的Java對象轉換爲JSON

這是存儲頁面輸出的通用對象。我不發佈JsonTest對象結構。它與任何具有屬性和setter以及getter的普通java類都相同。

class ListRow<T>{ 

    private int total; 
    private int currentRow; 
    private List<T> test; 


public ListRow(int total, int currentRow, List<T> test) { 
    this.total = total; 
    this.currentRow = currentRow; 
    this.test = test; 
} 
public int getTotal() { 
    return total; 
} 
public void setTotal(int total) { 
    this.total = total; 
} 
public int getCurrentRow() { 
    return currentRow; 
} 
public void setCurrentRow(int currentRow) { 
    this.currentRow = currentRow; 
} 
public List<T> getTest() { 
    return test; 
} 
public void setTest(List<T> test) { 
    this.test = test; 
} 



    JsonTest test = new JsonTest("naveen", 20, 20000); 
JsonTest test2 = new JsonTest("parveen", 20, 20000); 
JsonTest test3 = new JsonTest("pawan", 20, 20000); 
JsonTest test4 = new JsonTest("anil", 20, 20000); 

List<JsonTest> list = new ArrayList<JsonTest>(); 
list.add(test); 
list.add(test2); 
list.add(test3); 
list.add(test4); 

Gson gson = new Gson(); 
System.out.print(gson.toJson(list)); 

當我用這個值來運行這個程序,我得到了正確的輸出:

[{"name":"naveen","age":20,"salary":20000.0},{"name":"parveen","age":20,"salary":20000.0},{"name":"pawan","age":20,"salary":20000.0},{"name":"anil","age":20,"salary":20000.0}] 

但是,當我寫了下面的代碼來實現Java的通用功能,我沒有得到期望的輸出:

Gson gson = new Gson(); 
ListRow<JsonTest> dataList = new ListRow<JsonTest>(2, 2, list); 
System.out.print(gson.toJson(dataList)); 

輸出是:

{"total":2,"currentRow":2,"test":[{},{},{},{}]}. 

這段代碼有什麼問題?我如何獲得所需的輸出? 我想和通用功能工作,因爲我要爲網格編寫一次代碼,然後通過任何物體在網格中顯示。

Json的測試用例:

public static void main(String[] args) { 

    JsonTest test = new JsonTest("naveen", 20, 20000); 
    JsonTest test2 = new JsonTest("parveen", 20, 20000); 
    JsonTest test3 = new JsonTest("pawan", 20, 20000); 
    JsonTest test4 = new JsonTest("anil", 20, 20000); 

    List<JsonTest> list = new ArrayList<JsonTest>(); 
    list.add(test); 
    list.add(test2); 
    list.add(test3); 
    list.add(test4); 

    Gson gson = new Gson(); 
    System.out.print(gson.toJson(list)); 

    ListRow<JsonTest> dataList = new ListRow<JsonTest>(2, 2, list); 
    System.out.print(gson.toJson(dataList)); 

} 
+0

在您的瀏覽器搜索欄中輸入「GSON」,點擊第一個結果谷歌的回報,點擊「用戶指南」,點擊「序列化和反序列化泛型類型」,閱讀解決方案你的問題。 –

+0

class JsonTest在哪裏?請發帖 –

+0

我發佈了JsonTest。你可以看看嗎。 –

回答

5

添加TypeToken

Type type = new TypeToken<ListRow<JsonTest>>() {}.getType(); 
System.out.println(gson.toJson(dataList, type)); 

使用Token如果你想序列化/德的Collection

固定

public static void main(String[] args) { 
    Gson gson = new Gson(); 

    JsonTest test = new JsonTest("naveen", 20, 20000); 
    JsonTest test2 = new JsonTest("parveen", 20, 20000); 
    JsonTest test3 = new JsonTest("pawan", 20, 20000); 
    JsonTest test4 = new JsonTest("anil", 20, 20000); 

    List<JsonTest> list = new ArrayList<JsonTest>(); 
    list.add(test); 
    list.add(test2); 
    list.add(test3); 
    list.add(test4); 

    ListRow<JsonTest> dataList = new ListRow<JsonTest>(2, 2, list); 

    Type type = new TypeToken<ListRow<JsonTest>>() {}.getType(); 

    System.out.println(gson.toJson(dataList, type)); 
} 

輸出:

{"total":2,"currentRow":2,"test":[{"name":"naveen","age":20,"salary":20000.0},{"name":"parveen","age":20,"salary":20000.0},{"name":"pawan","age":20,"salary":20000.0},{"name":"anil","age":20,"salary":20000.0}]} 
+0

非常感謝Maxim。我得到了解決方案。 –

+2

不要忘了接受的答案,是另一種很好的方式說「謝謝」 :) – giampaolo