在我的上一篇文章中讲述了如何以Oracle数据表和递归子查询构建多叉树以及如何查询(地址为 http://blog.csdn.net/hellowordapi/article/details/75763432), 但是在我们查询出来后要把逻辑上抽象的树转换成带有层级数据的json结构,这样才能够在前端插件如Ztree或自己写的左侧栏中渲染完成业务需求。 下面是把数据库中的数据转成带有层次结构的代码。
需要引入的jar包maven地址为(也可以不引用只是博主喜欢了用Guava):
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>18.0</version>
</dependency>
如果不引入瓜娃,只需要把Lists.newArrayList(); 改为jdk实例化List的方式即可。
实体类:
import com.google.common.collect.Lists;
import net.sf.json.JSONObject;
/**
*
* @author zhoujie
*
*/
public class SidebarTree {
private String url;
private String urlname;
private String id; //节点
private String parent; //父节点
private JSONObject attributes = new JSONObject(); //net.sf.json
private List<SidebarTree> children= Lists.newArrayList(); //存放子节点
//get set
}
核心类:
public class TreeTest {
public static List<SidebarTree> formatTree(List<SidebarTree> list ){
SidebarTree root=new SidebarTree();
SidebarTree node=new SidebarTree();
List<SidebarTree> treelist=Lists.newArrayList(); //拼凑好的Json数据
List<SidebarTree> parentNodes=Lists.newArrayList(); // 存放所有父节点
if(list!=null && list.size()>0){
root=list.get(0); //第一个一定是根节点 0
for(int i=1; i<list.size(); i++){
node=list.get(i);
if(node.getParent().equals(root.getId())){ //从跟节点开始遍历是不是子节点
parentNodes.add(node);
root.getChildren().add(node);
}else{ //获取root子节点的孩子节点
getChildrenNodes(parentNodes, node);
parentNodes.add(node);
}
}
}
treelist.add(root);
return treelist;
}
private static void getChildrenNodes(List<SidebarTree> parentNodes , SidebarTree node){
for(int i=parentNodes.size()-1; i>=0; i--){
SidebarTree pnode=parentNodes.get(i);
if(pnode.getId().equals(node.getParent())){
pnode.getChildren().add(node);
return;
}
}
}
}
最终json格式:
[
{
"url": "*",
"urlname": "系统管理",
"id": "1",
"parent": "0",
"attributes": {},
"children": [
{
"url": "*",
"urlname": "权限管理",
"id": "2",
"parent": "1",
"attributes": {},
"children": [
{
"url": "/permission/index",
"urlname": "权限列表",
"id": "4",
"parent": "2",
"attributes": {},
"children": []
},
{
"url": "/permission/addPermission.shtml",
"urlname": "权限添加",
"id": "6",
"parent": "2",
"attributes": {},
"children": []
},
{
"url": "/permission/deletePermissionById",
"urlname": "权限删除",
"id": "7",
"parent": "2",
"attributes": {},
"children": []
},
{
"url": "/permission/addPermission2Role",
"urlname": "权限分配",
"id": "13",
"parent": "2",
"attributes": {},
"children": []
},
{
"url": "/permission/allocation",
"urlname": "权限分配2",
"id": "19",
"parent": "2",
"attributes": {},
"children": []
}
]
},
{
"url": "*",
"urlname": "用户管理",
"id": "22",
"parent": "1",
"attributes": {},
"children": [
{
"url": "/member/list.shtml",
"urlname": "用户列表",
"id": "8",
"parent": "22",
"attributes": {},
"children": []
},
{
"url": "/member/online.shtml",
"urlname": "在线用户",
"id": "9",
"parent": "22",
"attributes": {},
"children": []
},
{
"url": "/member/changeSessionStatus",
"urlname": "用户Session踢出",
"id": "10",
"parent": "22",
"attributes": {},
"children": []
},
{
"url": "/member/forbidUserById",
"urlname": "用户激活or禁止",
"id": "11",
"parent": "22",
"attributes": {},
"children": []
},
{
"url": "/member/deleteUserById",
"urlname": "用户删除",
"id": "12",
"parent": "22",
"attributes": {},
"children": []
}
]
},
{
"url": "*",
"urlname": "角色管理",
"id": "23",
"parent": "1",
"attributes": {},
"children": [
{
"url": "/role/clearRoleByUserIds",
"urlname": "用户角色分配清空",
"id": "14",
"parent": "23",
"attributes": {},
"children": []
},
{
"url": "/role/addRole2User",
"urlname": "角色分配保存",
"id": "15",
"parent": "23",
"attributes": {},
"children": []
},
{
"url": "/role/deleteRoleById.shtml",
"urlname": "角色列表删除",
"id": "16",
"parent": "23",
"attributes": {},
"children": []
},
{
"url": "/role/addRole",
"urlname": "角色列表添加",
"id": "17",
"parent": "23",
"attributes": {},
"children": []
},
{
"url": "role/index",
"urlname": "角色列表",
"id": "18",
"parent": "23",
"attributes": {},
"children": []
},
{
"url": "/role/allocation",
"urlname": "角色分配",
"id": "20",
"parent": "23",
"attributes": {},
"children": []
}
]
}
]
}
]