44 lines
1.9 KiB
Python
44 lines
1.9 KiB
Python
import json
|
|
import networkx as nx
|
|
|
|
def add_nodes_from_dict(graph, parent_node, current_dict):
|
|
for key, value in current_dict.items():
|
|
if isinstance(value, dict):
|
|
# Create a new node for the nested dictionary
|
|
new_node = f"{parent_node}.{key}"
|
|
graph.add_node(new_node, label=key)
|
|
# Add an edge from the parent node to the new node
|
|
graph.add_edge(parent_node, new_node, edge_type=key)
|
|
# Recurse into the nested dictionary
|
|
add_nodes_from_dict(graph, new_node, value)
|
|
elif isinstance(value, list):
|
|
|
|
# if list doesn't contain any nested dictionaries, make it a value in the node
|
|
if any(isinstance(item, dict) for item in value)==False:
|
|
graph.nodes[parent_node][key] = value
|
|
|
|
else:
|
|
|
|
# Process each dictionary in the list
|
|
for index, item in enumerate(value):
|
|
if isinstance(item, dict):
|
|
if len(value)>1:
|
|
item_node = f"{parent_node}.{key}[{index}]"
|
|
else:
|
|
item_node = f"{parent_node}.{key}"
|
|
graph.add_node(item_node, label=key)
|
|
graph.add_edge(parent_node, item_node, edge_type=key)
|
|
add_nodes_from_dict(graph, item_node, item)
|
|
|
|
else:
|
|
|
|
# For non-dict and non-list values, add them as attributes to the parent node
|
|
graph.nodes[parent_node][key] = value
|
|
|
|
def add_json_to_networkx(json_data, bundle_name, graph):
|
|
if not isinstance(graph, nx.DiGraph):
|
|
raise ValueError("The provided graph must be a networkx.DiGraph")
|
|
root_node = bundle_name+'_bundle'
|
|
graph.add_node(root_node, label='root')
|
|
add_nodes_from_dict(graph, root_node, json_data)
|