Create Tree object from Json
nathvi opened this issue · 3 comments
nathvi commented
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
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
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
Is there another (simple) way to load a tree from json without saving it ?