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

3

我有一棵树,节点长这样:

-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库,但节点类不可更改。
编辑:这种格式非常奇怪,但是必需的。 "属性"就是节点,如果"属性"有子项,则它们不会放在"属性"中,而是放在"属性"之后...我认为这不太合理,但我无法更改。

Freak2000:请在编辑您的问题时回答,而不是在评论中回答,这样会更容易。 - Valentin Rocher
你能使用JSON库吗?Node类是不可更改的吗? - slim
你能更详细地解释一下期望的输出吗?在我的回答中,我假设每个节点都有子节点。但是在你的输出中,“属性”对应一个节点,而且似乎“属性”没有子节点。那么有子节点的是什么? - slim
2个回答

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开头。
编辑:实际上,这并不创建与您问题中相同的结构。但我对您问题中的结构无法做出太多意义。然而,类似于此算法的某些东西将产生您想要的结果。原则是正确的。

这对我不起作用,其中一个原因是每个递归方法调用都会创建一个新的空JSON对象。 - Freak2000
不是一个“空”的JSON对象。您需要创建一个新的JSON对象树 - 每个“属性”块都需要一个。您需要调整此算法以创建实际所需的结构。 - slim
我不知道该怎么继续了... 我需要确切描述的格式... 我知道这是一个可怕的格式... 但我无法改变它。 - Freak2000

0
你只需要解析你的 "route" 属性,以便创建适当的图形表示。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接