From 00cadc86f0b2a27bdfb6ff979b665727d9bd92ca Mon Sep 17 00:00:00 2001 From: dgercho Date: Sun, 22 Jun 2025 16:21:24 +0300 Subject: [PATCH 1/2] Export json with id and add 'from_json' func --- treelib/tree.py | 32 +++++++++++++++++++++++++++++--- 1 file changed, 29 insertions(+), 3 deletions(-) diff --git a/treelib/tree.py b/treelib/tree.py index d9b761f..b68a5af 100644 --- a/treelib/tree.py +++ b/treelib/tree.py @@ -113,6 +113,28 @@ def __init__( if tree.identifier != self._identifier: new_node.clone_pointers(tree.identifier, self._identifier) + @classmethod + def from_json(cls, raw: Union[str, bytes, bytearray]): + """ + Load tree from exported JSON. + """ + tree = cls() + json_parsed = json.loads(raw) + + def _append_node(subtree, parent_id=None): + for tag, node_info in subtree.items(): + node_id = node_info["id"] + node_data = node_info.get("data") + tree.create_node( + tag=tag, identifier=node_id, parent=parent_id, data=node_data + ) + + for child in node_info.get("children", []): + _append_node(child, parent_id=node_id) + + _append_node(json_parsed) + return tree + def _clone( self, identifier: Optional[str] = None, @@ -1110,7 +1132,8 @@ def to_dict(self, nid=None, key=None, sort=True, reverse=False, with_data=False) nid = self.root if (nid is None) else nid ntag = self[nid].tag - tree_dict = {ntag: {"children": []}} + tree_dict = {ntag: {"id": nid, "children": []}} + if with_data: tree_dict[ntag]["data"] = self[nid].data @@ -1128,9 +1151,12 @@ def to_dict(self, nid=None, key=None, sort=True, reverse=False, with_data=False) ) if len(tree_dict[ntag]["children"]) == 0: tree_dict = ( - self[nid].tag if not with_data else {ntag: {"data": self[nid].data}} + {ntag: {"id": nid}} + if not with_data + else {ntag: {"id": nid, "data": self[nid].data}} ) - return tree_dict + + return tree_dict def to_json( self, with_data: bool = False, sort: bool = True, reverse: bool = False From 72c8f5600ea5bba86efbcffdda74ae503e514435 Mon Sep 17 00:00:00 2001 From: dgercho Date: Sun, 22 Jun 2025 17:09:45 +0300 Subject: [PATCH 2/2] Update test. --- tests/test_tree.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/tests/test_tree.py b/tests/test_tree.py index 6fd6a64..9d0e1a4 100644 --- a/tests/test_tree.py +++ b/tests/test_tree.py @@ -723,9 +723,14 @@ def test_shallow_paste(self): n3 = t3.create_node(identifier="C") t1.paste(n1.identifier, t2) - self.assertEqual(t1.to_dict(), {"A": {"children": ["B"]}}) + self.assertEqual( + t1.to_dict(), {"A": {"id": "A", "children": [{"B": {"id": "B"}}]}} + ) t1.paste(n1.identifier, t3) - self.assertEqual(t1.to_dict(), {"A": {"children": ["B", "C"]}}) + self.assertEqual( + t1.to_dict(), + {"A": {"id": "A", "children": [{"B": {"id": "B"}}, {"C": {"id": "C"}}]}}, + ) self.assertEqual(t1.level(n1.identifier), 0) self.assertEqual(t1.level(n2.identifier), 1)