利用java+mysql遞歸實現(xiàn)拼接樹形JSON列表的方法示例
前言
本文給大家介紹的是關于利用java+mysql遞歸實現(xiàn)拼接樹形JSON列表的相關內容,分享出來供大家參考學習,話不多說,來一起看看詳細的介紹:
我們在做Java web項目時,前端控件例如國家-省-市-區(qū)-縣等樹形列表,常常需要多級樹形json數(shù)據(jù)
例如:
[ { "name": "商品目錄", "pid": "-1", "id": "1", "children": [ { "name": "日用品", "pid": "1", "id": "11", "children": [ { "name": "洗發(fā)水", "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":"洗發(fā)水"}, {"id":"1111","pid":"111","name":"霸王"} ]
第二步,利用遞歸思想拼裝該數(shù)據(jù),拼裝方法的工具類如下:
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; } // 遞歸子節(jié)點 public void buildChildNodes(Node node) { List<Node> children = getChildNodes(node); if (!children.isEmpty()) { for (Node child : children) { buildChildNodes(child); } node.setChildren(children); } } // 獲取父節(jié)點下所有的子節(jié)點 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; } // 判斷是否為根節(jié)點 public boolean rootNode(Node node) { boolean isRootNode = true; for (Node n : nodes) { if (node.getPid().equals(n.getId())) { isRootNode = false; break; } } return isRootNode; } // 獲取集合中所有的根節(jié)點 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) { // 獲取全部目錄節(jié)點 List<Node> nodes = iGoodsDirSvc.getAllDirList(); // 拼裝樹形json字符串 String json = new TreeBuilder().buildTree(nodes); return json; }
其中iGoodsDirSvc.getAllDirList()
方法需要將取到的數(shù)據(jù)轉為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();
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關文章
maven如何利用springboot的配置文件進行多個環(huán)境的打包
這篇文章主要介紹了maven如何利用springboot的配置文件進行多個環(huán)境的打包,在Spring Boot中多環(huán)境配置文件名需要滿足application-{profiles.active}.properties的格式,其中{profiles.active}對應你的環(huán)境標識,本文給大家詳細講解,需要的朋友可以參考下2023-02-02Spring MVC數(shù)據(jù)處理和亂碼問題詳解
這篇文章主要給大家介紹了關于Spring MVC數(shù)據(jù)處理和亂碼問題的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-12-12詳解Java中的線程讓步y(tǒng)ield()與線程休眠sleep()方法
Java中的線程讓步會讓線程讓出優(yōu)先級,而休眠則會讓線程進入阻塞狀態(tài)等待被喚醒,這里我們對比線程等待的wait()方法,來詳解Java中的線程讓步y(tǒng)ield()與線程休眠sleep()方法2016-07-07SpringBoot實現(xiàn)excel文件生成和下載
這篇文章主要為大家詳細介紹了SpringBoot實現(xiàn)excel文件生成和下載,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-02-02Spring使用注解方式實現(xiàn)創(chuàng)建對象
這篇文章主要介紹了Spring使用注解方式實現(xiàn)創(chuàng)建對象,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2023-02-02基于Spring boot @Value 注解注入屬性值的操作方法
這篇文章主要介紹了結合SpEL使用@Value-基于配置文件或非配置的文件的值注入-Spring Boot的相關知識,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-07-07通過Spring Boot配置動態(tài)數(shù)據(jù)源訪問多個數(shù)據(jù)庫的實現(xiàn)代碼
這篇文章主要介紹了通過Spring Boot配置動態(tài)數(shù)據(jù)源訪問多個數(shù)據(jù)庫的實現(xiàn)代碼,需要的朋友可以參考下2018-03-03