Конвертировать два ArrayLists в JSON, используя GSON

1

У меня есть 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)

В чем проблема? И как я могу это исправить?

  • 1
    возможный дубликат Не удалось сериализовать объектную причину HibernateProxy
  • 0
    @andersschuller Я уже видел эту тему, и она была недостаточно ясна.
Показать ещё 6 комментариев
Теги:
arraylist

3 ответа

1

Я нашел решение:

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


}
0

Сделайте это, чтобы вытащить элементы из списков прокси в список ArrayLists:

List<Node> nodes = new ArrayList<Node>();
nodes.addAll(DAO.listNodes());

List<Link> links = new ArrayList<Link>();
links.addAll(DAO.listLinks());
  • 0
    Я попробовал, до сих пор нет результата
-2

Сначала получите строку 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();

спасибо

  • 0
    Спасибо, но я все еще получаю ту же ошибку здесь!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню