Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Create Tree object from Json #186

Open
nathvi opened this issue Sep 7, 2021 · 3 comments
Open

Create Tree object from Json #186

nathvi opened this issue Sep 7, 2021 · 3 comments

Comments

@nathvi
Copy link

nathvi commented Sep 7, 2021

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
Copy link

ahuard0 commented Sep 15, 2021

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
Copy link

ahuard0 commented Sep 20, 2021

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
Copy link

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

4 participants