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)