如何将复杂的Java对象转换为JSON

3

我正在尝试将一个复杂的Java对象转换为JSON格式,但是我无法成功。

我正在使用Java泛型。

这是用于存储页面输出的通用对象。我没有发布JsonTest对象结构。它与任何普通的Java类相同,具有属性和setter和getter方法。

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));

}

在浏览器搜索栏中输入"gson",点击谷歌返回的第一个结果,点击"用户指南",点击"序列化和反序列化通用类型",阅读解决方案以解决您的问题。 - JB Nizet
请问 JsonTest 类在哪里?请发布它。 - Maxim Shoustin
我已经发布了JsonTest。您能看一下吗? - keepmoving
1个回答

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

如果您想序列化/反序列化Collection,请使用Token。

已解决

 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}]}

2
不要忘记接受答案,这是另一种说“谢谢”的好方式 :) - giampaolo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接