代码之家  ›  专栏  ›  技术社区  ›  ikevin8me

如何将serialize DefaultMutableTreeNode(Java)转换成JSON?

  •  0
  • ikevin8me  · 技术社区  · 6 年前

    如何序列化树(用Java实现) DefaultMutableTreeNode 类)到JSON(用于通过RESTful方法传输到IOS客户机)?

    我试过:

    String jsonString = (new Gson()).toJson(topNode);
    // topNode is DefaultMutableTreeNode at the root
    

    它坠毁了。 StackOverflowError .

    1 回复  |  直到 6 年前
        1
  •  2
  •   Thomas Fritsch    6 年前

    秋千 DefaultMutableTreeNode 类是类似树的数据结构 其中包含此类型的实例 children 作为 parent . 这就是为什么gson的默认序列化程序遇到无限递归的原因。 然后扔了一个 StackOverflowError .

    要解决此问题,您需要自定义 Gson 聪明的人 JsonSerializer 专门为 默认可变TreeNode S.

    为了这个创造你的 格森 实例不只是由 new Gson() 但通过

    Gson gson = new GsonBuilder()
            .registerTypeAdapter(DefaultMutableTreeNode.class, new DefaultMutableTreeNodeSerializer())
            .setPrettyPrinting()
            .create();
    

    这个 DefaultMutableTreeNodeSerializer 以下是责任 用于转换 默认可变TreeNode 给JSON。 它转换其属性 allowsChildren , leaf , userObject 儿童 给JSON。 请注意,它不会转换 起源 JSON的属性, 因为这样做会再次产生一个极小的递归。

    public class DefaultMutableTreeNodeSerializer implements JsonSerializer<DefaultMutableTreeNode> {
    
        @Override
        public JsonElement serialize(DefaultMutableTreeNode src, Type typeOfSrc, JsonSerializationContext context) {
            JsonObject jsonObject = new JsonObject();
            jsonObject.addProperty("allowsChildren", src.getAllowsChildren());
            jsonObject.addProperty("leaf", src.isLeaf());
            jsonObject.add("userObject", context.serialize(src.getUserObject()));
            JsonArray jsonArray = new JsonArray();
            for (int i= 0; i < src.getChildCount(); i++) {
               jsonArray.add(context.serialize(src.getChildAt(i)));
            }
            jsonObject.add("children", jsonArray);
            return jsonObject;
        }
    }
    

    对于测试,让我们序列化示例的根节点 JTree .

    enter image description here

    JTree tree = new JTree();  // create a sample tree
    Object topNode = tree.getModel().getRoot();
    String jsonString = gson.toJson(topNode);
    System.out.println(jsonString);
    

    它生成以下JSON输出:

    {
      "allowsChildren": true,
      "leaf": false,
      "userObject": "JTree",
      "children": [
        {
          "allowsChildren": true,
          "leaf": false,
          "userObject": "colors",
          "children": [
            {
              "allowsChildren": true,
              "leaf": true,
              "userObject": "blue",
              "children": []
            },
            {
              "allowsChildren": true,
              "leaf": true,
              "userObject": "violet",
              "children": []
            },
            {
              "allowsChildren": true,
              "leaf": true,
              "userObject": "red",
              "children": []
            },
            {
              "allowsChildren": true,
              "leaf": true,
              "userObject": "yellow",
              "children": []
            }
          ]
        },
        {
          "allowsChildren": true,
          "leaf": false,
          "userObject": "sports",
          "children": [
            {
              "allowsChildren": true,
              "leaf": true,
              "userObject": "basketball",
              "children": []
            },
            {
              "allowsChildren": true,
              "leaf": true,
              "userObject": "soccer",
              "children": []
            },
            {
              "allowsChildren": true,
              "leaf": true,
              "userObject": "football",
              "children": []
            },
            {
              "allowsChildren": true,
              "leaf": true,
              "userObject": "hockey",
              "children": []
            }
          ]
        },
        {
          "allowsChildren": true,
          "leaf": false,
          "userObject": "food",
          "children": [
            {
              "allowsChildren": true,
              "leaf": true,
              "userObject": "hot dogs",
              "children": []
            },
            {
              "allowsChildren": true,
              "leaf": true,
              "userObject": "pizza",
              "children": []
            },
            {
              "allowsChildren": true,
              "leaf": true,
              "userObject": "ravioli",
              "children": []
            },
            {
              "allowsChildren": true,
              "leaf": true,
              "userObject": "bananas",
              "children": []
            }
          ]
        }
      ]
    }