【发布时间】:2014-08-25 10:55:37
【问题描述】:
我有一个 Graph 类,它有两个 ArrayLists 作为成员变量,我想使用 GSON 库将其转换为 JSON 文件。
这是类Graph的代码:
public class Graph {
private List<Node> nodes;
private List<Link> links;
// Constructors, Getters and Setters
}
这是类节点的代码:
public class Node {
private String name;
private int group;
// Constructors, Getters and Setters
}
这是类Link的代码:
public class Link {
private int source;
private int target;
// Constructors, Getters and Setters
}
这是我要生成的 JSON 文件:
{
"nodes":[
{"name":"Myriel","group":1},
{"name":"Napoleon","group":1},
{"name":"Mlle.Baptistine","group":2},
{"name":"Mme.Hucheloup","group":2}
],
"links":[
{"source":1,"target":0},
{"source":2,"target":0},
{"source":3,"target":1},
{"source":3,"target":2}
]
}
这是主类:
public class Main {
public static void main(String[] args) throws IOException {
Graph graph = new Graph();
List<Node> nodes = new ArrayList<Node>();
nodes = DAO.listNodes(); //This function fills the list from a database
List<Link> links = new ArrayList<Link>();
links = DAO.listLinks(); //This function fills the list from a database
graph.setNodes(nodes);
graph.setLinks(links);
Writer writer = new FileWriter("output.json");
Gson gson = new GsonBuilder().setPrettyPrinting().create();
gson.toJson(graph, writer);
writer.close();
}
}
这是我得到的错误:
Exception in thread "main" java.lang.UnsupportedOperationException: Attempted to serialize java.lang.Class: org.hibernate.proxy.HibernateProxy. Forgot to register a type adapter?
at com.google.gson.internal.bind.TypeAdapters$1.write(TypeAdapters.java:68)
at com.google.gson.internal.bind.TypeAdapters$1.write(TypeAdapters.java:61)
at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:68)
at com.google.gson.internal.bind.ArrayTypeAdapter.write(ArrayTypeAdapter.java:93)
at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:68)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:91)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:206)
at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:68)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:91)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:206)
at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:68)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:91)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:206)
at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:68)
at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.write(CollectionTypeAdapterFactory.java:96)
at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.write(CollectionTypeAdapterFactory.java:60)
at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:68)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:91)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:206)
at com.google.gson.Gson.toJson(Gson.java:595)
at com.google.gson.Gson.toJson(Gson.java:574)
at com.google.gson.Gson.toJson(Gson.java:549)
at gson.Main.main(Main.java:36)
有什么问题?我该如何解决?
【问题讨论】:
-
@andersschuller 我已经看到了这个话题,但还不够清楚。
-
你没有任何 ArrayLists。您创建了两个 ArrayList,但随后将它们替换为 DAO.listNodes/Links 的返回值。
-
@Boann 你能解释更多吗?
-
@user1885868 这个分配给
nodes没有任何作用:= new ArrayList<Node>(),因为在下一行,你用= DAO.listNodes()重新分配它。