版权声明:尊重原创,如要转载,请写好来源。谢谢 https://blog.csdn.net/qq_39052982/article/details/89148518
Hello , 大家好。
long time no see.
今天我带来了怎么给前端返回一个树状json。关于有层级关系时我们应该怎么做呢?
很多人可能会想到用递归这个方式,但是用递归的话… 稍不留神就陷入死循环。然后占满了栈。这个雷本小白踩过。哈哈哈。
好了,经过自己的不断尝试,最后用到了一种比较笨的方法来解决这个问题。虽然代码比递归要多了那么一丢丢,但是比较简单。适合小白理解。往下看…
我刚开始用的是递归,咱们看看代码
这是manage层
//用List构建带有层次结构的json数据
//List父子节点构造树形Json
//将list集合转成树形结构的list集合
public static List<TConMenu> listToTree(List<TConMenu> list) {
//用递归找子。
List<TConMenu> treeList = new ArrayList<TConMenu>();
for (TConMenu tree : list) {
if (tree.getName().equals(null)) {
treeList.add(findChildren(tree, list));
}
}
return treeList;
}
//寻找子节点
private static TConMenu findChildren(TConMenu tree, List<TConMenu> list) {
for (TConMenu node : list) {
if (node.getName().equals(tree.getName())) {
if (tree.getChildren() == null) {
tree.setChildren(new ArrayList<TConMenu>());
}
tree.getChildren().add(findChildren(node, list));
}
}
return tree;
}
接着看看service层
public List<TConMenu> selectMenuTree(){
List<TConMenu> dbMenuList = manage.selectListTree();
return dobuildMenuTree(dbMenuList);
//调用方法生成树形结构的List集合
List<TConMenu> treeList = manage.listToTree(tConMenus);
//使用fastjson对树形list件序列化转成json字符串,过滤掉属性值为null的属性
String message = JSON.toJSONString(treeList,SerializerFeature.PrettyFormat);
JSONObject returnData = new JSONObject();
//重新将json字符串转成jsonObject对象,返回给前端
returnData.put("message",JSON.parse(message));
return returnData;
}
这是测试service的test
@Test
public void selectTree(){
JSONObject jsonObject = conMenuService.selectMenuTree();
System.out.println(jsonObject);
}
以上使用的是递归方式咱们看看运行结果
以上就是报的错误,目前我这个小白技术太菜了,陷入了死循环,堆满了栈搞得栈溢出来了。这不能怪谁,怪自己。
但是… 我并没有气馁。我换了种方式,(奸笑~)
接着往下看。我用了个比较笨的办法,
这是service层
private List<TConMenu> dobuildMenuTree(List<TConMenu> menuList) {
//获取第一级节点数据
List<TConMenu> oneLevelMenuList = new ArrayList<>();
Map<String, TConMenu> oneLevelMenuMap = new HashMap<>();
//其他节点数据
List<TConMenu> childrenMenuList = new ArrayList<>();
for (TConMenu menu : menuList) {
if (StringUtils.isEmpty(menu.getParentId())) {
oneLevelMenuList.add(menu);
oneLevelMenuMap.put(menu.getId(),menu);
} else {
childrenMenuList.add(menu);
}
}
//整理二级菜单,放到一级菜单的children节点钟
List<TConMenu> threeLevelMenuList = new ArrayList<>();
Map<String, TConMenu> twoLevelMenuMap = new HashMap<>();
doGatherChildren(oneLevelMenuMap, childrenMenuList, twoLevelMenuMap,threeLevelMenuList);
//整理三级菜单,放到二级菜单的children节点
List<TConMenu> fourLevelMenuList = new ArrayList<>();
Map<String, TConMenu> threeLevelMenuMap = new HashMap<>();
doGatherChildren(twoLevelMenuMap, threeLevelMenuList, threeLevelMenuMap,fourLevelMenuList);
return oneLevelMenuList;
}
private void doGatherChildren(Map<String, TConMenu> parentMenuMap, List<TConMenu> allChildrenList,
Map<String, TConMenu> childrenMenuMap, List<TConMenu> childrenList ) {
for (TConMenu menu : allChildrenList) {
String parentId = menu.getParentId();
if (parentMenuMap.containsKey(parentId)) {
TConMenu parentMenu = parentMenuMap.get(parentId);
parentMenu.addChildMenu(menu);
childrenMenuMap.put(menu.getId(),menu);
} else {
childrenList.add(menu);
}
}
}
方法写完了,接着就是调用了。
public List<TConMenu> selectMenuTree(){
List<TConMenu> dbMenuList = manage.selectListTree();
return dobuildMenuTree(dbMenuList);
}
然后咱们看运行结果。
就出来了。凡事多尝试几次。
最后这个方法比较笨,用了几个list几个map。代码量比较多。
但是能实现出来就好了。
一名正在努力的小白,所以如果这篇文章哪里有不对的地方。请告知。
最后,谢谢大家的浏览。