Java递归算法构造JSON树形结构

本文介绍了如何使用Java处理id-pid结构的数据库菜单表,将其转换为树形JSON格式,以满足项目需求。核心代码简洁,关键在于思路清晰。项目中依赖了json-lib.jar来实现List到JSON的序列化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.前言

最近项目中有一个需求,数据库中的菜单表是一个常见的id-pid结构,需要把它构建成树形的JSON格式发送给第三方,写出来之后感觉也是很简单的,核心代码只有5行,重要的是思路要明确,这里把源码分享给大家。

工程里面使用了json-lib.jar这个包,作用是将List序列化成JSON

/** * 根据等级查询类目树 * * @param level * @return */ @Override public List queryCategoryTree(Integer level) { //查询当前级别下类目 List list = categoryDAO.list(level); //组装好的类目树,返回前端 List categoryTree = new ArrayList(); //所有类目 List allDTOList = new ArrayList(); if (CollectionUtils.isEmpty(list)) { return categoryTree; } for (CategoryDO categoryDO : list) { allDTOList.add(new CategoryTreeDTO().convertDOToDTO(categoryDO)); } //当前等级类目 categoryTree = allDTOList.stream().filter(dto -> level.equals(dto.getLevel())).collect(Collectors.toList()); for (CategoryTreeDTO categoryTreeDTO : categoryTree) { //组装类目为树结构 assembleTree(categoryTreeDTO, allDTOList,Constants.CATEGORY_MAX_LEVEL - level); } return categoryTree; } /** * 组装树 * * @param categoryTreeDTO * @param allList * @param remainRecursionCount 剩余递归次数 * @return */ public CategoryTreeDTO assembleTree(CategoryTreeDTO categoryTreeDTO, List allList, int remainRecursionCount) { remainRecursionCount--; //最大递归次数不超过Constants.CATEGORY_MAX_LEVEL-level次,防止坏数据死循环 if(remainRecursionCount < 0){ return categoryTreeDTO; } String categoryCode = categoryTreeDTO.getCategoryCode(); Integer level = categoryTreeDTO.getLevel(); //到达最后等级树返回 if (Constants.CATEGORY_MAX_LEVEL == level) { return categoryTreeDTO; } //子类目 List child = allList.stream().filter(a -> categoryCode.equals(a.getParentCode())).collect(Collectors.toList()); if (null == child) { return categoryTreeDTO; } categoryTreeDTO.setChildren(child); //组装子类目 for (CategoryTreeDTO dto : child) { assembleTree(dto, allList,remainRecursionCount); } return categoryTreeDTO; }
参考资源链接:[Java+MySQL递归构建树形JSON实例与工具类详解](https://wenku.youkuaiyun.com/doc/6412b714be7fbd1778d49051?utm_source=wenku_answer2doc_content) 在Java Web开发中,要构建树形结构JSON数据,通常需要对数据库进行递归查询,并在Java中处理这些数据以形成一个树形结构。这里涉及到的关键技术点包括递归查询的SQL语句、数据结构的定义以及递归算法的实现。为了更好地理解这一过程,可以参考《Java+MySQL递归构建树形JSON实例与工具类详解》这份资料,它详细介绍了实现这一功能的全过程。 首先,在MySQL中,我们可以使用带有`START WITH`和`CONNECT BY`子句的递归查询语句来获取目录信息及其子目录。例如,可以使用以下SQL语句来获取所有目录及其层级关系: ```sql SELECT id, pid, name FROM directories START WITH id = :rootId CONNECT BY PRIOR id = pid ORDER BY level, id; ``` 这里的`:rootId`是一个占位符,用于指定根目录的ID,在实际应用中可以用具体的根目录ID替代。 然后,在Java端,我们需要定义一个数据结构来存储从数据库查询到的结果,并且实现递归构建树形结构算法。这通常涉及到以下几个步骤: 1. 定义一个类,例如`TreeNode`,来表示树中的一个节点。这个类通常包含节点的ID、父ID和名称等属性,以及可能的一个子节点列表。 ```java public class TreeNode { private int id; private int parentId; private String name; private List<TreeNode> children = new ArrayList<>(); // 构造方法、getter和setter省略 } ``` 2. 实现一个递归方法,例如`buildTree`,它接受一个包含所有节点的列表,并递归地构建出树形结构。 ```java public TreeNode buildTree(List<TreeNode> nodes) { Map<Integer, TreeNode> nodeMap = new HashMap<>(); TreeNode root = null; // 将所有节点添加到一个映射中,方便后续查找 for (TreeNode node : nodes) { nodeMap.put(node.getId(), node); if (node.getParentId() == -1) { // 假设根节点的parentId为-1 root = node; } } // 递归构建树形结构 buildTreeRecursive(root, nodeMap); return root; } private void buildTreeRecursive(TreeNode node, Map<Integer, TreeNode> nodeMap) { for (TreeNode child : nodes) { if (child.getParentId() == node.getId()) { node.getChildren().add(child); buildTreeRecursive(child, nodeMap); } } } ``` 3. 最后,将构建好的树形结构转换为JSON格式。可以使用如Jackson或Gson的库来帮助实现。 通过上述步骤,我们可以将数据库中的扁平化数据转换为具有层级关系的树形JSON数据。这种结构在前端用于展示具有层级关系的菜单、部门结构等场景中非常有用。为了更深入地掌握这一技术,可以进一步阅读《Java+MySQL递归构建树形JSON实例与工具类详解》这本书籍,它不仅提供了一个完整的工作实例,还详细解释了每个步骤的原理和实现方法,为理解和应用这一技术提供了全面的支持。 参考资源链接:[Java+MySQL递归构建树形JSON实例与工具类详解](https://wenku.youkuaiyun.com/doc/6412b714be7fbd1778d49051?utm_source=wenku_answer2doc_content)
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值