在关系型数据库中查询得到的树状数据(如下图),结果是个列表,如何在代码中把他转换为嵌套的对象呢(比如嵌套的Map)?或者直接转为JSON也可以,有没有相关的java或C#代码实现?
从结构可以看出,逐行读取,根据Parent或Level比较,应该是可以实现的,但具体怎么弄还是一头雾水。
数据如下(Parent一栏为父节点ID应该更合适):
希望返回结果如下:
{
id:1,
Name:"大学",
children:{
id: 2,
name: "学院",
children:{
id: 3,
name: "计算机学院",
children:{
...
...
}
}
},
{
id: 7,
name: "教务处"
}
}
欢迎赐教,谢谢。
最终自己解决了,暂时还没发现有啥问题。代码如下:
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 }
谢谢回复的各位。
根据 ParentID 以及 ID ,比如大学的ID 是0 ,属于最上层,那么Level 为1 的 ParentID 就为 0 ,以此类推。
数据表已经体现了树结构,但这个是深度优先的结果,我想转换为嵌套的对象。
我尝试下写了一下,有些复杂,回去今晚写好后再回你。
觉得这应该是个很常用的算法,但一直没搜索到合适的解决方案、
@万里沙来手一挥: 算法用的是递归,具体代码还需要调试一下。
搞了一晚上,还是不正确。
放到java层处理倒是也没错,不过可以用存储过程,然后转存进json对象,比如:
declare ret json; begin ret := json_dyn.executeObject('select * from TABLE'); ret.print; end;
存储过程也只能递归调用才能得到树结构吧
直接在java层转成json倒是不错,思路和前面代码类似。