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

