【问题标题】:Convert Two ArrayLists to JSON using GSON使用 GSON 将两个 ArrayList 转换为 JSON
【发布时间】: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&lt;Node&gt;(),因为在下一行,你用= DAO.listNodes() 重新分配它。

标签: java json arraylist


【解决方案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;
    }


}

【讨论】:

    【解决方案2】:

    这样做可以将代理列表中的元素拉到 ArrayLists 中:

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

    【讨论】:

      【解决方案3】:

      先从gson获取JSON字符串,然后写入文件。

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

      谢谢

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-07-26
        • 2015-05-16
        • 2018-11-16
        • 1970-01-01
        相关资源
        最近更新 更多