服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|编程技术|正则表达式|C/C++|

服务器之家 - 编程语言 - JAVA教程 - 利用java+mysql递归实现拼接树形JSON列表的方法示例

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

2020-12-12 15:54coder_小康 JAVA教程

这篇文章主要给大家介绍了关于利用java+mysql递归实现拼接树形JSON列表的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面跟着小编来一起看看吧。

前言

本文给大家介绍的是关于利用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

延伸 · 阅读

精彩推荐