caesar0301 / treelib

An efficient implementation of tree data structure in python 2/3.
http://treelib.readthedocs.io/en/latest/
Other
800 stars 185 forks source link

Create Tree object from Json #186

Open nathvi opened 2 years ago

nathvi commented 2 years ago

Not sure if this is already possible, but I at least didn't see anything in the documentation.

Something like...

json_tree = #Json object here t = Tree(json_tree)

ahuard0 commented 2 years ago

I had to parse the JSON dictionary/list structure to reconstruct the Tree object:

import json
from pathlib import PurePosixPath, Path
from treelib import Node, Tree

def LoadTreeJSON(self, loadpath_json=None):
    if loadpath_json is None:
        loadpath_json = self.GetFilePathJSON()
    if loadpath_json is None:
        return
    with open(loadpath_json) as file:
        self.tree = Tree()
        data = json.load(file)
        for key1, value1 in data.items():
            node1=PurePosixPath(key1)
            self.tree.create_node(tag=key1, identifier=str(node1), parent=None)
            for list1 in value1['children']:
                for key2, value2 in list1.items():
                    node2=PurePosixPath(key1, key2)
                    self.tree.create_node(tag=key2, identifier=str(node2), parent=str(node1))
                    for list2 in value2['children']:
                        for key3, value3 in list2.items():
                            node3=PurePosixPath(key1, key2, key3)
                            self.tree.create_node(tag=key3, identifier=str(node3), parent=str(node2))
                            for list3 in value3['children']:
                                if isinstance(list3, dict):  # Process Only Filled Directories
                                    for key4, value4 in list3.items():
                                        node4=PurePosixPath(key1, key2, key3, key4)
                                        self.tree.create_node(tag=key4, identifier=str(node4), parent=str(node3))
                                        for list4 in value4['children'][0:]:
                                            node5=PurePosixPath(key1, key2, key3, key4, list4)
                                            self.tree.create_node(tag=list4, identifier=str(node5), parent=str(node4))
ahuard0 commented 2 years ago

I found a much better solution that works amazingly well. Treelib trees and nodes are fully serializable, which allows the Pickle module to save the tree as a binary file. Doing this is surprisingly fast, even when working with trees that are megabytes in size.

def SaveTree(self, savepath_pickle):
    with open(savepath_pickle, "wb") as file:
        pickle.dump(self.tree, file)

def LoadTree(self, loadpath_pickle):
    with open(loadpath_pickle, 'rb') as file:
        self.tree = pickle.load(file)
lironesamoun commented 2 years ago

Is there another (simple) way to load a tree from json without saving it ?