JAVA 根据数据库表内容生产树结构JSON数据

1、利用场景

  组织机构树,通常会有组织机构表,其中有code(代码),pcode(上级代码),name(组织名称)等字段

2、构造数据(以下数据并不是组织机构数据,而纯属本人胡编乱造的数据)

 1 List<Tree<Test>> trees = new ArrayList<Tree<Test>>();
 2 tests.add(new Test("0", "", "关于本人"));
 3 tests.add(new Test("1", "0", "技术学习"));
 4 tests.add(new Test("2", "0", "兴趣"));
 5 tests.add(new Test("3", "1", "JAVA"));
 6 tests.add(new Test("4", "1", "oracle"));
 7 tests.add(new Test("5", "1", "spring"));
 8 tests.add(new Test("6", "1", "springmvc"));
 9 tests.add(new Test("7", "1", "fastdfs"));
10 tests.add(new Test("8", "1", "linux"));
11 tests.add(new Test("9", "2", "骑行"));
12 tests.add(new Test("10", "2", "吃喝玩乐"));
13 tests.add(new Test("11", "2", "学习"));
14 tests.add(new Test("12", "3", "String"));
15 tests.add(new Test("13", "4", "sql"));
16 tests.add(new Test("14", "5", "ioc"));
17 tests.add(new Test("15", "5", "aop"));
18 tests.add(new Test("16", "1", "等等"));
19 tests.add(new Test("17", "2", "等等"));
20 tests.add(new Test("18", "3", "等等"));
21 tests.add(new Test("19", "4", "等等"));
22 tests.add(new Test("20", "5", "等等"));

3、源码

Tree.java

  1 package pers.kangxu.datautils.bean.tree;
  2 
  3 import java.util.ArrayList;
  4 import java.util.List;
  5 import java.util.Map;
  6 
  7 import com.alibaba.fastjson.JSON;
  8 
  9 /**
 10  * tree TODO <br>
 11  * 
 12  * @author kangxu2 2017-1-7
 13  * 
 14  */
 15 public class Tree<T> {
 16     /**
 17      * 节点ID
 18      */
 19     private String id;
 20     /**
 21      * 显示节点文本
 22      */
 23     private String text;
 24     /**
 25      * 节点状态,open closed
 26      */
 27     private String state = "open";
 28     /**
 29      * 节点是否被选中 true false
 30      */
 31     private boolean checked = false;
 32     /**
 33      * 节点属性
 34      */
 35     private List<Map<String, Object>> attributes;
 36     /**
 37      * 节点的子节点
 38      */
 39     private List<Tree<T>> children = new ArrayList<Tree<T>>();
 40 
 41     /**
 42      * 父ID
 43      */
 44     private String parentId;
 45     /**
 46      * 是否有父节点
 47      */
 48     private boolean isParent = false;
 49     /**
 50      * 是否有子节点
 51      */
 52     private boolean isChildren = false;
 53 
 54     public String getId() {
 55         return id;
 56     }
 57 
 58     public void setId(String id) {
 59         this.id = id;
 60     }
 61 
 62     public String getText() {
 63         return text;
 64     }
 65 
 66     public void setText(String text) {
 67         this.text = text;
 68     }
 69 
 70     public String getState() {
 71         return state;
 72     }
 73 
 74     public void setState(String state) {
 75         this.state = state;
 76     }
 77 
 78     public boolean isChecked() {
 79         return checked;
 80     }
 81 
 82     public void setChecked(boolean checked) {
 83         this.checked = checked;
 84     }
 85 
 86     public List<Map<String, Object>> getAttributes() {
 87         return attributes;
 88     }
 89 
 90     public void setAttributes(List<Map<String, Object>> attributes) {
 91         this.attributes = attributes;
 92     }
 93 
 94     public List<Tree<T>> getChildren() {
 95         return children;
 96     }
 97 
 98     public void setChildren(List<Tree<T>> children) {
 99         this.children = children;
100     }
101 
102     public boolean isParent() {
103         return isParent;
104     }
105 
106     public void setParent(boolean isParent) {
107         this.isParent = isParent;
108     }
109 
110     public boolean isChildren() {
111         return isChildren;
112     }
113 
114     public void setChildren(boolean isChildren) {
115         this.isChildren = isChildren;
116     }
117 
118     public String getParentId() {
119         return parentId;
120     }
121 
122     public void setParentId(String parentId) {
123         this.parentId = parentId;
124     }
125 
126     public Tree(String id, String text, String state, boolean checked,
127             List<Map<String, Object>> attributes, List<Tree<T>> children,
128             boolean isParent, boolean isChildren, String parentID) {
129         super();
130         this.id = id;
131         this.text = text;
132         this.state = state;
133         this.checked = checked;
134         this.attributes = attributes;
135         this.children = children;
136         this.isParent = isParent;
137         this.isChildren = isChildren;
138         this.parentId = parentID;
139     }
140 
141     public Tree() {
142         super();
143     }
144 
145     @Override
146     public String toString() {
147         
148         return JSON.toJSONString(this);
149     }
150 
151 }

BuildTree.java

 1 package pers.kangxu.datautils.common.tree;
 2 
 3 import java.util.ArrayList;
 4 import java.util.List;
 5 
 6 import pers.kangxu.datautils.bean.tree.Tree;
 7 
 8 /**
 9  * 构建tree
10  * TODO
11  * <br>
12  * @author kangxu2 2017-1-7
13  *
14  */
15 public class BuildTree {
16 
17     /**
18      * 
19      * TODO
20      * <br>
21      * @author kangxu2 2017-1-7
22      *
23      * @param nodes
24      * @return
25      */
26     public static <T> Tree<T> build(List<Tree<T>> nodes) {
27 
28         if(nodes == null){
29             return null;
30         }
31         List<Tree<T>> topNodes = new ArrayList<Tree<T>>();
32 
33         for (Tree<T> children : nodes) {
34 
35             String pid = children.getParentId();
36             if (pid == null || "".equals(pid)) {
37                 topNodes.add(children);
38 
39                 continue;
40             }
41 
42             for (Tree<T> parent : nodes) {
43                 String id = parent.getId();
44                 if (id != null && id.equals(pid)) {
45                     parent.getChildren().add(children);
46                     children.setParent(true);
47                     parent.setChildren(true);
48                     
49                     continue;
50                 }
51             }
52 
53         }
54 
55         Tree<T> root = new Tree<T>();
56         if (topNodes.size() == 1) {
57             root = topNodes.get(0);
58         } else {
59             root.setId("-1");
60             root.setParentId("");
61             root.setParent(false);
62             root.setChildren(true);
63             root.setChecked(true);
64             root.setChildren(topNodes);
65             root.setText("顶级节点");
66 
67         }
68 
69         return root;
70     }
71 
72 }

BuildTreeTester.java

 1 package pers.kangxu.datautils.test;
 2 
 3 import java.util.ArrayList;
 4 import java.util.List;
 5 
 6 import pers.kangxu.datautils.bean.tree.Tree;
 7 import pers.kangxu.datautils.common.tree.BuildTree;
 8 
 9 public class BuildTreeTester {
10 
11     public static void main(String[] args) {
12         
13         
14         List<Tree<Test>> trees = new ArrayList<Tree<Test>>();
15         List<Test> tests = new ArrayList<Test>();
16         tests.add(new Test("0", "", "关于本人"));
17         tests.add(new Test("1", "0", "技术学习"));
18         tests.add(new Test("2", "0", "兴趣"));
19         tests.add(new Test("3", "1", "JAVA"));
20         tests.add(new Test("4", "1", "oracle"));
21         tests.add(new Test("5", "1", "spring"));
22         tests.add(new Test("6", "1", "springmvc"));
23         tests.add(new Test("7", "1", "fastdfs"));
24         tests.add(new Test("8", "1", "linux"));
25         tests.add(new Test("9", "2", "骑行"));
26         tests.add(new Test("10", "2", "吃喝玩乐"));
27         tests.add(new Test("11", "2", "学习"));
28         tests.add(new Test("12", "3", "String"));
29         tests.add(new Test("13", "4", "sql"));
30         tests.add(new Test("14", "5", "ioc"));
31         tests.add(new Test("15", "5", "aop"));
32         tests.add(new Test("16", "1", "等等"));
33         tests.add(new Test("17", "2", "等等"));
34         tests.add(new Test("18", "3", "等等"));
35         tests.add(new Test("19", "4", "等等"));
36         tests.add(new Test("20", "5", "等等"));
37         
38         for (Test test : tests) {
39             Tree<Test> tree = new Tree<Test>();
40             tree.setId(test.getId());
41             tree.setParentId(test.getPid());
42             tree.setText(test.getText());
43             
44             trees.add(tree);
45         }
46 
47         Tree<Test> t = BuildTree.build(trees);
48         System.out.println(t);
49     }
50 }
51 
52 class Test {
53 
54     private String id;
55     private String pid;
56     private String text;
57 
58     public String getId() {
59         return id;
60     }
61 
62     public void setId(String id) {
63         this.id = id;
64     }
65 
66     public String getPid() {
67         return pid;
68     }
69 
70     public void setPid(String pid) {
71         this.pid = pid;
72     }
73 
74     public String getText() {
75         return text;
76     }
77 
78     public void setText(String text) {
79         this.text = text;
80     }
81 
82     public Test(String id, String pid, String text) {
83         super();
84         this.id = id;
85         this.pid = pid;
86         this.text = text;
87     }
88 
89     public Test() {
90         super();
91     }
92 
93     @Override
94     public String toString() {
95         return "Test [id=" + id + ", pid=" + pid + ", text=" + text + "]";
96     }
97 
98 }

4、运行结果

JSON数据:

  1 {
  2     "checked":false,
  3     "children":[
  4         {
  5             "checked":false,
  6             "children":[
  7                 {
  8                     "checked":false,
  9                     "children":[
 10                         {
 11                             "checked":false,
 12                             "children":[
 13 
 14                             ],
 15                             "id":"12",
 16                             "parent":true,
 17                             "parentId":"3",
 18                             "state":"open",
 19                             "text":"String"
 20                         },
 21                         {
 22                             "checked":false,
 23                             "children":[
 24 
 25                             ],
 26                             "id":"18",
 27                             "parent":true,
 28                             "parentId":"3",
 29                             "state":"open",
 30                             "text":"等等"
 31                         }
 32                     ],
 33                     "id":"3",
 34                     "parent":true,
 35                     "parentId":"1",
 36                     "state":"open",
 37                     "text":"JAVA"
 38                 },
 39                 {
 40                     "checked":false,
 41                     "children":[
 42                         {
 43                             "checked":false,
 44                             "children":[
 45 
 46                             ],
 47                             "id":"13",
 48                             "parent":true,
 49                             "parentId":"4",
 50                             "state":"open",
 51                             "text":"sql"
 52                         },
 53                         {
 54                             "checked":false,
 55                             "children":[
 56 
 57                             ],
 58                             "id":"19",
 59                             "parent":true,
 60                             "parentId":"4",
 61                             "state":"open",
 62                             "text":"等等"
 63                         }
 64                     ],
 65                     "id":"4",
 66                     "parent":true,
 67                     "parentId":"1",
 68                     "state":"open",
 69                     "text":"oracle"
 70                 },
 71                 {
 72                     "checked":false,
 73                     "children":[
 74                         {
 75                             "checked":false,
 76                             "children":[
 77 
 78                             ],
 79                             "id":"14",
 80                             "parent":true,
 81                             "parentId":"5",
 82                             "state":"open",
 83                             "text":"ioc"
 84                         },
 85                         {
 86                             "checked":false,
 87                             "children":[
 88 
 89                             ],
 90                             "id":"15",
 91                             "parent":true,
 92                             "parentId":"5",
 93                             "state":"open",
 94                             "text":"aop"
 95                         },
 96                         {
 97                             "checked":false,
 98                             "children":[
 99 
100                             ],
101                             "id":"20",
102                             "parent":true,
103                             "parentId":"5",
104                             "state":"open",
105                             "text":"等等"
106                         }
107                     ],
108                     "id":"5",
109                     "parent":true,
110                     "parentId":"1",
111                     "state":"open",
112                     "text":"spring"
113                 },
114                 {
115                     "checked":false,
116                     "children":[
117 
118                     ],
119                     "id":"6",
120                     "parent":true,
121                     "parentId":"1",
122                     "state":"open",
123                     "text":"springmvc"
124                 },
125                 {
126                     "checked":false,
127                     "children":[
128 
129                     ],
130                     "id":"7",
131                     "parent":true,
132                     "parentId":"1",
133                     "state":"open",
134                     "text":"fastdfs"
135                 },
136                 {
137                     "checked":false,
138                     "children":[
139 
140                     ],
141                     "id":"8",
142                     "parent":true,
143                     "parentId":"1",
144                     "state":"open",
145                     "text":"linux"
146                 },
147                 {
148                     "checked":false,
149                     "children":[
150 
151                     ],
152                     "id":"16",
153                     "parent":true,
154                     "parentId":"1",
155                     "state":"open",
156                     "text":"等等"
157                 }
158             ],
159             "id":"1",
160             "parent":true,
161             "parentId":"0",
162             "state":"open",
163             "text":"技术学习"
164         },
165         {
166             "checked":false,
167             "children":[
168                 {
169                     "checked":false,
170                     "children":[
171 
172                     ],
173                     "id":"9",
174                     "parent":true,
175                     "parentId":"2",
176                     "state":"open",
177                     "text":"骑行"
178                 },
179                 {
180                     "checked":false,
181                     "children":[
182 
183                     ],
184                     "id":"10",
185                     "parent":true,
186                     "parentId":"2",
187                     "state":"open",
188                     "text":"吃喝玩乐"
189                 },
190                 {
191                     "checked":false,
192                     "children":[
193 
194                     ],
195                     "id":"11",
196                     "parent":true,
197                     "parentId":"2",
198                     "state":"open",
199                     "text":"学习"
200                 },
201                 {
202                     "checked":false,
203                     "children":[
204 
205                     ],
206                     "id":"17",
207                     "parent":true,
208                     "parentId":"2",
209                     "state":"open",
210                     "text":"等等"
211                 }
212             ],
213             "id":"2",
214             "parent":true,
215             "parentId":"0",
216             "state":"open",
217             "text":"兴趣"
218         }
219     ],
220     "id":"0",
221     "parent":false,
222     "parentId":"",
223     "state":"open",
224     "text":"关于本人"
225 }

 

posted @ 2017-01-08 00:24  kangxu  阅读(10131)  评论(1编辑  收藏  举报