如何使用networkx可视化任意json?

Rom*_*man 2 python recursion json networkx

我有一个 JSON 对象。例如:

js = {'a':'b', 'c':[10, 20], 'd':{'f':'k', 'l':'m'}}
Run Code Online (Sandbox Code Playgroud)

现在,我想使用networkx库来显示可视化此 JSON 的图表。更详细地说,对于给定的示例,我希望有一个指向acd节点的“根”节点。然后a节点应该指向b 节点,c节点应该指向1020d节点应该指向fl节点,最后fl节点应该分别指向km节点。所以,我想执行以下操作:

G=nx.Graph()
G.dad_nodes_from(['a', 'c', 'd', 'b', 10, 20, 'f', 'l', 'k', 'm'])
G.add_edge('a','b')
G.add_edge('c',10)
G.add_edge('c',20)
G.add_edge('d','f')
G.add_edge('d','l')
G.add_edge('f','k')
G.add_edge('l','m')
Run Code Online (Sandbox Code Playgroud)

我可以手动完成,但是如何自动完成呢?

添加:d部分问题来自于可能引用不同对象的事实。因此,d因为一个字典中的键与另一字典中的键不是同一节点d

rya*_*nmc 5

下面应该会有所帮助,但对于您的附加部分,您将需要检查密钥是否存在并修改(d,d1,d2)。如果你有这样的例子我可以编辑。

%matplotlib inline 

import networkx as nx

js = {'a':'b', 'c':[10, 20], 'd':{'f':'k', 'l':'m'}}

G=nx.Graph()
for key in js.keys():
    G.add_edge('ROOT',key)

def walk(node):
    for key, item in node.items():
        if isinstance(item, list):
            for i in item:
                G.add_edge(key,i)
        if isinstance(item, dict):
            for j in item.keys():
                G.add_edge(key,j)
            walk(item)
        elif isinstance(item,str):
            G.add_edge(key,item)

walk(js)
nx.draw(G,with_labels=True)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述