查询出来的数据返回给前端呈树状Json格式

版权声明:尊重原创,如要转载,请写好来源。谢谢 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。代码量比较多。
但是能实现出来就好了。

一名正在努力的小白,所以如果这篇文章哪里有不对的地方。请告知。
最后,谢谢大家的浏览。

猜你喜欢

转载自blog.csdn.net/qq_39052982/article/details/89148518