tree_utils.py 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. import json
  2. from typing import List, Dict
  3. from dataclasses import dataclass
  4. @dataclass
  5. class TreeNodeDTO:
  6. id: int
  7. name: str
  8. pId: int
  9. @dataclass
  10. class TreeDTO:
  11. nodes: List[TreeNodeDTO]
  12. def get_tree_dto(tree_json: str) -> TreeDTO:
  13. """
  14. 将JSON树结构转换为TreeDTO
  15. :param tree_json: JSON格式的树结构字符串
  16. :return: TreeDTO对象
  17. """
  18. tree_dto = TreeDTO(nodes=[])
  19. try:
  20. tree_obj = json.loads(tree_json)
  21. if tree_obj:
  22. # 使用计数器生成唯一ID
  23. id_counter = 0
  24. # 存储父节点路径到ID的映射
  25. path_id_map = {}
  26. # 根节点特殊处理
  27. root_id = id_counter
  28. id_counter += 1
  29. path_id_map["根节点"] = root_id
  30. # 从根节点开始构建树
  31. add_tree(tree_dto.nodes, tree_obj, path_id_map, "根节点", id_counter, "根节点")
  32. except json.JSONDecodeError:
  33. pass
  34. return tree_dto
  35. def add_tree(nodes: List[TreeNodeDTO], tree_obj: Dict, path_id_map: Dict[str, int],
  36. parent_name: str, id_counter: int, parent_path: str):
  37. """
  38. 递归添加树节点
  39. :param nodes: 节点列表
  40. :param tree_obj: 树对象
  41. :param path_id_map: 路径到ID的映射
  42. :param parent_path: 父节点路径
  43. :param id_counter: ID计数器
  44. :param current_path: 当前节点路径
  45. """
  46. # 构建当前节点的完整路径
  47. current_path = f"{parent_path}/{tree_obj['name']}"
  48. # 生成当前节点ID
  49. current_id = id_counter
  50. id_counter += 1
  51. path_id_map[current_path] = current_id
  52. # 获取父节点ID
  53. parent_id = path_id_map[parent_path]
  54. # 判断是否为叶子节点
  55. is_leaf = not tree_obj.get('sNode', [])
  56. # 创建树节点
  57. node = TreeNodeDTO(
  58. id=current_id,
  59. name=tree_obj['name'],
  60. pId=parent_id
  61. )
  62. nodes.append(node)
  63. # 递归处理子节点
  64. if not is_leaf:
  65. for child in tree_obj['sNode']:
  66. id_counter = add_tree(nodes, child, path_id_map,
  67. tree_obj['name'], id_counter, current_path)
  68. return id_counter