如何将JSON数据转换为树形图像?

时间:2016-10-18 21:10:12

标签: python json tree

我正在使用treelib生成树,现在我需要易于阅读的树版本,因此我想将它们转换为图像。例如: enter image description here

以下树的示例JSON数据:

enter image description here

使用数据:

>>> print(tree.to_json(with_data=True))
{"Harry": {"data": null, "children": [{"Bill": {"data": null}}, {"Jane": {"data": null, "children": [{"Diane": {"data": null}}, {"Mark": {"data": null}}]}}, {"Mary": {"data": null}}]}}

没有数据:

>>> print(tree.to_json(with_data=False))
{"Harry": {"children": ["Bill", {"Jane": {"children": [{"Diane": {"children": ["Mary"]}}, "Mark"]}}]}}

是否仍然使用graphvizd3.js或其他一些python库来使用此JSON数据生成树?

2 个答案:

答案 0 :(得分:7)

对于这样的树,不需要使用库:您可以直接生成Graphviz DOT语言语句。唯一棘手的部分是从JSON数据中提取树边。为此,我们首先将JSON字符串转换回Python dict,然后递归地解析dict

如果树字典中的名字没有子节点,则它是一个简单的字符串,否则,它是一个字典,我们需要扫描其"children"列表中的项目。我们找到的每个(父,子)对都会附加到全局列表edges

这个有点神秘的界限:

name = next(iter(treedict.keys()))

treedict获取一个密钥。这给了我们这个人的名字,因为那是treedict中唯一的关键。在Python 2中我们可以做到

name = treedict.keys()[0]

但前面的代码适用于Python 2和Python 3。

from __future__ import print_function
import json
import sys

# Tree in JSON format
s = '{"Harry": {"children": ["Bill", {"Jane": {"children": [{"Diane": {"children": ["Mary"]}}, "Mark"]}}]}}'

# Convert JSON tree to a Python dict
data = json.loads(s)

# Convert back to JSON & print to stderr so we can verify that the tree is correct.
print(json.dumps(data, indent=4), file=sys.stderr)

# Extract tree edges from the dict
edges = []

def get_edges(treedict, parent=None):
    name = next(iter(treedict.keys()))
    if parent is not None:
        edges.append((parent, name))
    for item in treedict[name]["children"]:
        if isinstance(item, dict):
            get_edges(item, parent=name)
        else:
            edges.append((name, item))

get_edges(data)

# Dump edge list in Graphviz DOT format
print('strict digraph tree {')
for row in edges:
    print('    {0} -> {1};'.format(*row))
print('}')

stderr输出

{
    "Harry": {
        "children": [
            "Bill",
            {
                "Jane": {
                    "children": [
                        {
                            "Diane": {
                                "children": [
                                    "Mary"
                                ]
                            }
                        },
                        "Mark"
                    ]
                }
            }
        ]
    }
}

标准输出

strict digraph tree {
    Harry -> Bill;
    Harry -> Jane;
    Jane -> Diane;
    Diane -> Mary;
    Jane -> Mark;
}

上面的代码在Python 2& Python 3.它将JSON数据打印到stderr,以便我们验证它是否正确。然后它将Graphviz数据打印到stdout,以便我们可以将其捕获到文件或直接将其传递给Graphviz程序。例如,如果脚本名称为“tree_to_graph.py”,则可以在命令行中执行此操作,将图形保存为名为“tree.png”的PNG文件:

python tree_to_graph.py | dot -Tpng -otree.png

这是PNG输出:

Tree made by Graphviz

答案 1 :(得分:1)

基于PM 2Ring的答案,我创建了一个可以通过命令行使用的脚本:

npm install -g yo generator-rn-toolbox
yo rn-toolbox:assets --splash IMGAE --android