利用java+mysql递归实现拼接树形JSON列表的方法示例
时间:2019-03-31
本文章向大家介绍利用java+mysql递归实现拼接树形JSON列表的方法示例,主要包括利用java+mysql递归实现拼接树形JSON列表的方法示例使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
前言
本文给大家介绍的是关于利用java+mysql递归实现拼接树形JSON列表的相关内容,分享出来供大家参考学习,话不多说,来一起看看详细的介绍:
我们在做Java web项目时,前端控件例如国家-省-市-区-县等树形列表,常常需要多级树形json数据
例如:
[ { "name": "商品目录", "pid": "-1", "id": "1", "children": [ { "name": "日用品", "pid": "1", "id": "11", "children": [ { "name": "洗发水", "pid": "11", "id": "111", "children": [ { "name": "霸王", "pid": "111", "id": "1111", "children": [] } ] } ] }, { "name": "食品", "pid": "1", "id": "12", "children": [] } ] } ]
整体思路分为两步,第一步获取目录及其所有子目录,获取后的列表形式如下:
[ {"id":"1","pid":"-1","name":"商品目录"}, {"id":"11","pid":"1","name":"日用品"}, {"id":"12","pid":"1","name":"食品"}, {"id":"111","pid":"11","name":"洗发水"}, {"id":"1111","pid":"111","name":"霸王"} ]
第二步,利用递归思想拼装该数据,拼装方法的工具类如下:
package *.*.*; import net.sf.json.JSONArray; import java.util.ArrayList; import java.util.List; /** * 构造目录JSON树 * Created by fukang on 2017/5/26 0026. */ public class TreeBuilder { List<Node> nodes = new ArrayList<>(); public String buildTree(List<Node> nodes) { TreeBuilder treeBuilder = new TreeBuilder(nodes); return treeBuilder.buildJSONTree(); } public TreeBuilder() { } public TreeBuilder(List<Node> nodes) { super(); this.nodes = nodes; } // 构建JSON树形结构 public String buildJSONTree() { List<Node> nodeTree = buildTree(); JSONArray jsonArray = JSONArray.fromObject(nodeTree); return jsonArray.toString(); } // 构建树形结构 public List<Node> buildTree() { List<Node> treeNodes = new ArrayList<>(); List<Node> rootNodes = getRootNodes(); for (Node rootNode : rootNodes) { buildChildNodes(rootNode); treeNodes.add(rootNode); } return treeNodes; } // 递归子节点 public void buildChildNodes(Node node) { List<Node> children = getChildNodes(node); if (!children.isEmpty()) { for (Node child : children) { buildChildNodes(child); } node.setChildren(children); } } // 获取父节点下所有的子节点 public List<Node> getChildNodes(Node pnode) { List<Node> childNodes = new ArrayList<>(); for (Node n : nodes) { if (pnode.getId().equals(n.getPid())) { childNodes.add(n); } } return childNodes; } // 判断是否为根节点 public boolean rootNode(Node node) { boolean isRootNode = true; for (Node n : nodes) { if (node.getPid().equals(n.getId())) { isRootNode = false; break; } } return isRootNode; } // 获取集合中所有的根节点 public List<Node> getRootNodes() { List<Node> rootNodes = new ArrayList<>(); for (Node n : nodes) { if (rootNode(n)) { rootNodes.add(n); } } return rootNodes; } public static class Node { private String id; private String pid; private String name; private List<Node> children; public Node() { } public Node(String id, String pid, String name) { super(); this.id = id; this.pid = pid; this.name = name; } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getPid() { return pid; } public void setPid(String pid) { this.pid = pid; } public String getName() { return name; } public void setName(String name) { this.name = name; } public List<Node> getChildren() { return children; } public void setChildren(List<Node> children) { this.children = children; } } }
在Controller中的调用方法是:
@RequestMapping("/bulidJsonTree") @ResponseBody public String buildJsonTree(HttpServletRequest request) { // 获取全部目录节点 List<Node> nodes = iGoodsDirSvc.getAllDirList(); // 拼装树形json字符串 String json = new TreeBuilder().buildTree(nodes); return json; }
其中iGoodsDirSvc.getAllDirList()
方法需要将取到的数据转为Node类型:
String hql = "select id as id,pId as pid,name as name from Directory"; Query query = factory.getCurrentSession().createQuery(hql) .setResultTransformer(Transformers.aliasToBean(TreeBuilder.Node.class)); return query.list();
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- String - 345. Reverse Vowels of a String
- String - 186. Reverse Words in a String II
- String - 151. Reverse Words in a String
- String - 344. Reverse String
- String - 383. Ransom Note
- String - 58. Length of Last Word
- String - 14. Longest Common Prefix
- String - 28. Implement strStr()
- Subsequence - 187. Repeated DNA Sequences
- Subsequence - 392. Is Subsequence
- parentheses - 241. Different Ways to Add Parentheses
- parentheses - 32. Longest Valid Parentheses
- parentheses - 22. Generate Parentheses
- palindrome - 132. Palindrome Partitioning II
- palindrome - 131. Palindrome Partitioning