如何将树路径转换为json对象

时间:2012-08-21 15:10:50

标签: java json tree

我有一个像这样的节点的树:

-Root
|-Node 1
|-Node 2
  |-Node 2.1

其中一个节点由一个类

代表
class Node {
    Integer id;
    String name;
    String route;
}

显示节点的实例保存为

{id: 1, name: "Root", route:"1"}
{id: 2, name: "Node 1", route: "1/2"}
{id: 3, name: "Node 2", route: "1/3"}
{id: 4, name: "Node 2.1", route: "1/3/4"}

问题是:如何从节点列表到表示树状态的json,例如:

[{
"property": {
    "name": "Root",
    "id": "1",
    "route": "1"
},
"children": [{
    "property": {
        "name": "Node 1",
        "id": "2",
        "route": "1/2"
    },
    "property": {
        "name": "Node 2",
        "id": "3",
        "route": "1/3"
    },
    "children": [{
        "property": {
            "name": "Node 3",
            "id": "4",
            "route": "1/3/4"
        }
    }]
}]
}]

我需要这个json结构

所有这些都必须在java中完成。我试图遍历我的节点列表并构建json对象,但我有问题从节点的路由字段获取json结构

我能够使用json库,节点类是不可更改的

编辑:这种格式很奇怪,但需要。 “属性”是节点,如果“属性”有孩子,他们就不会被放置在属性中,以后属性......我认为这不是很有意义但我无法改变它

2 个答案:

答案 0 :(得分:4)

您可以尝试这样的算法:

public JSONObject toJSON(Node node, List<Node> others) {
    JSONObject json = new JSONObject();
    json.put("id", node.id); // and so on
    ...
    List children = new ArrayList<JSONObject>();
    for(Node subnode : others) {
        if(isChildOf(subnode, node)) {
            others.remove(subnode);
            children.add(toJSON(subnode, others));
        }
    }
    json.put("children", children);
    return json;
}

您在迭代时修改列表,并且递归调用也会迭代它。这可能是毛茸茸的,但试试吧。如果失败,可以采取各种方法。

isChildOf()是缺失的部分。这是一些相当基本的字符串操作,以查看subnode.path是否以node.id

开头

编辑:实际上这不会创建与您的问题相同的结构。但是我无法理解你问题中的结构。然而,与此算法非常相似的东西将产生您想要的效果。原则是合理的。

答案 1 :(得分:0)

您只需要解析route属性,以便制作正确的图表。