У меня есть Graph
классов, в котором есть два ArrayLists в качестве переменных-членов, и я хотел бы преобразовать их в файл JSON с помощью библиотеки GSON.
Это код класса Graph:
public class Graph {
private List<Node> nodes;
private List<Link> links;
// Constructors, Getters and Setters
}
Это код класса Node:
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)
В чем проблема? И как я могу это исправить?
Я нашел решение:
GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.registerTypeAdapter(Node.class, new NodeAdapter()).registerTypeAdapter(Link.class, new LinkAdapter());
Gson gson = gsonBuilder.create();
writer.write(gson.toJson(graph));
Он создал файл JSON так, как я этого хотел.
Спасибо за вашу помощь!
Это класс LinkAdapter
:
public class LinkAdapter implements JsonSerializer<Link> {
public JsonElement serialize(Link link, Type type,
JsonSerializationContext jsc) {
JsonObject jsonObject = new JsonObject();
jsonObject.addProperty("source", link.getNodeBySource().getIdNode());
jsonObject.addProperty("target", link.getNodeByTarget().getIdNode());
return jsonObject;
}
}
И это класс NodeAdapter
:
public class NodeAdapter implements JsonSerializer<Node> {
public JsonElement serialize(Node node, Type type,
JsonSerializationContext jsc) {
JsonObject jsonObject = new JsonObject();
jsonObject.addProperty("name", node.getName());
jsonObject.addProperty("group", node.getHyperEdge().getIdHe());
return jsonObject;
}
}
Сделайте это, чтобы вытащить элементы из списков прокси в список ArrayLists:
List<Node> nodes = new ArrayList<Node>();
nodes.addAll(DAO.listNodes());
List<Link> links = new ArrayList<Link>();
links.addAll(DAO.listLinks());
Сначала получите строку JSON из gson, а затем запишите ее в файл.
Graph graph = new Graph()
//This function fills the list from a database
List<Node> nodes = DAO.listNodes();
//This function fills the list from a database
List<Link> links = DAO.listLinks();
graph.setNodes(nodes);
graph.setLinks(links);
File file = new File("output.json");
// creates the file
file.createNewFile();
// creates a FileWriter Object
FileWriter writer = new FileWriter(file);
// Write JSON content to the file
writer.write(gson.toJson(graph));
writer.flush();
writer.close();
спасибо