利用java+mysql递归实现拼接树形JSON列表的方法示例

时间:2021-08-22 13:34:52

前言

本文给大家介绍的是关于利用java+mysql递归实现拼接树形JSON列表的相关内容,分享出来供大家参考学习,话不多说,来一起看看详细的介绍:

我们在做Java web项目时,前端控件例如国家-省-市-区-县等树形列表,常常需要多级树形json数据

例如:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
[
 {
 "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": []
  }
 ]
 }
]

整体思路分为两步,第一步获取目录及其所有子目录,获取后的列表形式如下:

?
1
2
3
4
5
6
7
[
 {"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":"霸王"}
]

第二步,利用递归思想拼装该数据,拼装方法的工具类如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
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中的调用方法是:

?
1
2
3
4
5
6
7
8
9
10
11
12
@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类型:

?
1
2
3
4
5
6
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();

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对服务器之家的支持。

原文链接:http://blog.csdn.net/qq12547345/article/details/72765889