首页 新闻 会员 周边 捐助

数据库查询得到树结构数据如何转换为嵌套的对象?

0
悬赏园豆:160 [已解决问题] 解决于 2017-03-16 16:01

在关系型数据库中查询得到的树状数据(如下图),结果是个列表,如何在代码中把他转换为嵌套的对象呢(比如嵌套的Map)?或者直接转为JSON也可以,有没有相关的java或C#代码实现?

从结构可以看出,逐行读取,根据Parent或Level比较,应该是可以实现的,但具体怎么弄还是一头雾水。

数据如下(Parent一栏为父节点ID应该更合适):

希望返回结果如下:

{

id:1,

Name:"大学",

children:{

  id: 2,

  name: "学院",

  children:{

      id: 3,

      name: "计算机学院",

      children:{

        ...

        ...

      }

    }

  },

  {

  id: 7,

  name: "教务处"

  }

}

欢迎赐教,谢谢。

万里沙来手一挥的主页 万里沙来手一挥 | 初学一级 | 园豆:196
提问于:2017-03-10 16:18
< >
分享
最佳答案
0

最终自己解决了,暂时还没发现有啥问题。代码如下:

 1 public static List<Map> transAjacentListToTree(List<Map> list, String levelTitle) throws Exception {
 2         ArrayList<Map> tree = new ArrayList<Map>();
 3         Stack<Object> stack = new Stack<Object>();
 4         stack.push(tree);
 5         int curLevel = 0, preLevel=-1;
 6         ArrayList<Map> container =  tree;
 7         Map preNode=null, curNode=null;
 8 
 9         for (int i = 0; i < list.size(); i++) {
10             curNode = list.get(i);
11             curLevel = new Integer(curNode.get(levelTitle).toString());
12             if (i == 0) {               
13                 container.add(curNode);
14             } else if (preLevel == curLevel) {
15                 container.add(curNode);
16             } else if( curLevel-preLevel==1 ) {                
17                 ArrayList<Map> children = new ArrayList<Map>();
18                 children.add(curNode);
19                 if(preNode!=null){
20                     preNode.put("children", children); 
21                 } 
22                 stack.push(container);
23                 container = children;                
24             }else if (curLevel<preLevel){
25                 for(int j=1; j<preLevel-curLevel; j++){
26                     stack.pop();
27                 }
28                 container = (ArrayList<Map>)stack.pop();
29                 container.add(curNode);
30             }else{
31                 throw new  Exception("数据错误");
32             }
33             preNode = curNode;
34             preLevel = curLevel;
35         }
36 
37         return tree;
38     }

谢谢回复的各位。

万里沙来手一挥 | 初学一级 |园豆:196 | 2017-03-12 15:23
其他回答(3)
0

根据 ParentID 以及 ID ,比如大学的ID 是0 ,属于最上层,那么Level 为1 的 ParentID 就为 0 ,以此类推。

收获园豆:30
BUTTERAPPLE | 园豆:3190 (老鸟四级) | 2017-03-10 16:21

 数据表已经体现了树结构,但这个是深度优先的结果,我想转换为嵌套的对象。

支持(0) 反对(0) 万里沙来手一挥 | 园豆:196 (初学一级) | 2017-03-10 16:25
0

我尝试下写了一下,有些复杂,回去今晚写好后再回你。

收获园豆:100
龙行天涯 | 园豆:1794 (小虾三级) | 2017-03-10 17:57

觉得这应该是个很常用的算法,但一直没搜索到合适的解决方案、

支持(0) 反对(0) 万里沙来手一挥 | 园豆:196 (初学一级) | 2017-03-10 18:15

@万里沙来手一挥: 算法用的是递归,具体代码还需要调试一下。

支持(0) 反对(0) 龙行天涯 | 园豆:1794 (小虾三级) | 2017-03-10 18:21

搞了一晚上,还是不正确。

支持(0) 反对(0) 龙行天涯 | 园豆:1794 (小虾三级) | 2017-03-10 22:39
0

放到java层处理倒是也没错,不过可以用存储过程,然后转存进json对象,比如:

declare 
  ret json;
begin
  ret := json_dyn.executeObject('select * from TABLE');
  ret.print;
end;
收获园豆:30
CaiYongji | 园豆:1267 (小虾三级) | 2017-03-13 13:38

存储过程也只能递归调用才能得到树结构吧

支持(0) 反对(0) 万里沙来手一挥 | 园豆:196 (初学一级) | 2017-03-13 14:55

 直接在java层转成json倒是不错,思路和前面代码类似。

支持(0) 反对(0) 万里沙来手一挥 | 园豆:196 (初学一级) | 2017-03-13 14:56
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册