【问题标题】:How to convert an tree path to a json object如何将树路径转换为 ​​json 对象
【发布时间】:2012-08-21 15:10:49
【问题描述】:

我有一棵树,其节点如下:

-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 :编辑您的问题而不是在 cmets 中回答,这会容易得多
  • 你能使用 JSON 库吗? Node 类是不可更改的吗?
  • 您能否更详细地解释所需的输出。在我的回答中,我假设每个节点都有孩子。但是在您的输出中,“属性”对应于节点,并且“属性”似乎没有子节点。什么是有孩子的?

标签: java json tree


【解决方案1】:

你可以试试这样的算法:

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 对象
  • 嗯,不是 empty JSON 对象。您确实想创建一棵新的 JSON 对象树 - 每个“属性”块都有一个。你需要调整这个算法来创建你真正想要的结构。
  • 我不知道如何继续...我需要确切的描述格式...我知道它的格式很糟糕...但我无法更改它
【解决方案2】:

您只需要解析您的 route 属性即可做出正确的图形表示。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-24
    • 1970-01-01
    相关资源
    最近更新 更多