Java 递归获取菜单树
Java 递归获取菜单树
- Java 递归获取菜单树
- 数据模型
- 递归程序
- 最上级菜单数据
- 最下级菜单数据
- 检测菜单树
- 使用谷歌的Gson
- POM文件
- 解析操作
- 使用阿里的FastJson
- POM文件
- 解析操作
Java 递归获取菜单树
递归生成一个菜单树结构,整体思路如下所示:
- 编写两个类数据模型Menu和创建树形的MenuTree集合,用于存储菜单树数据。
- 编写递归程序,遍历每一个父节点下面的数据。
- 检查递归返回的数据合理性。
数据模型
数据模型Menu和创建树形的MenuTree集合,存储每一个节点下的菜单树!
具体代码如下所示:
public class Menu {private String id;// 菜单当前节点private String pid;// 菜单父节点private String menuName;// 菜单名字private List<Menu> subMenu;// 子菜单public Menu() {}public Menu(String id, String pid, String menuName) {this.id = id;this.pid = pid;this.menuName = menuName;}public String getId() {return id;}public void setId(String id) {this.id = id;}public String getPid() {return pid;}public void setPid(String pid) {this.pid = pid;}public String getMenuName() {return menuName;}public void setMenuName(String menuName) {this.menuName = menuName;}public List<Menu> getSubMenu() {return subMenu;}public void setSubMenu(List<Menu> subMenu) {this.subMenu = subMenu;}
}
递归程序
递归获取菜单树整体思路如下所示:
- 获取菜单范围内搜索。
- 获取最上级菜单的数据。
- 获取上级菜单的全部子菜单。
- 通过获取的当前菜单的子菜单的数据,通过当前子菜单的数据再获取当前子菜单下的子菜单数据,直到无子菜单数据即可退出递归。
通过上述思路,具体代码实现如下!
最上级菜单数据
/*** 获取最上级菜单与最上级菜单下的子菜单数据* @return*/public static List<Menu> findTreeMenu(){List<Menu> menus = findAllMenu(); //获取菜单范围内数据。List<Menu> rootMenus = new ArrayList<>();for (Menu menu : menus) {//从最上级菜单开始展示if(menu.getPid() == null){rootMenus.add(menu);}}for (Menu rootMenu : rootMenus) {//把最上级菜单的子菜单获取到,子菜单的子菜单也会获取到List<Menu> child = getChild(rootMenu.getId(), menus);rootMenu.setSubMenu(child);}return rootMenus;}
最下级菜单数据
/***通过传入当前菜单id,获取当前菜单id的子菜单 且子菜单里也有子菜单的数据,直到无子菜单数据即可退出递归* @param id 当前菜单的id* @param menus 要查询的菜单范围* @return 该id的子菜单*/private static List<Menu> getChild(String id, List<Menu> menus){List<Menu> childList = new ArrayList<>();for (Menu menu : menus) {if(id.equals(menu.getPid())){//获取当前菜单id的所有子列表childList.add(menu);}}for (Menu menu : childList) {//将该id的子菜单进行遍历,通过递归调用,获取每一个子菜单的子菜单数据List<Menu> child = getChild(menu.getId(), menus);menu.setSubMenu(child);}if(childList.size()==0){//子菜单的长度为0,返回null,null不会被阿里的FastJson包解析return null;}return childList;}
检测菜单树
使用谷歌的Gson
POM文件
引入所需要解析的Pom文件,如下所示:
<dependency><groupId>com.google.code.gsongroupId><artifactId>gsonartifactId><version>2.2.4version>dependency>
解析操作
List<Menu> treeMenu = findTreeMenu();
Gson gson = new Gson();
String s1 = gson.toJson(treeMenu);
System.out.println("使用谷歌的Gson:"+s1);
具体解析返回值:
使用谷歌的Gson:[{"id":"0","menuName":"小麦系统管理","subMenu":[{"id":"1","pid":"0","menuName":"首页"},{"id":"2","pid":"0","menuName":"用户管理","subMenu":[{"id":"21","pid":"2","menuName":"用户增加"},{"id":"22","pid":"2","menuName":"用户修改"},{"id":"23","pid":"2","menuName":"用户删除","subMenu":[{"id":"231","pid":"23","menuName":"用户恢复","subMenu":[{"id":"2311","pid":"231","menuName":"用户恢复-load"}]}]}]},{"id":"3","pid":"0","menuName":"菜单管理","subMenu":[{"id":"31","pid":"3","menuName":"菜单增加"}]}]}]
主要区别是:

使用阿里的FastJson
POM文件
引入所需要解析的Pom文件,如下所示:
<dependency><groupId>com.alibabagroupId><artifactId>fastjsonartifactId><version>2.0.1version>
dependency>
解析操作
List<Menu> treeMenu = findTreeMenu();
String s = JSON.toJSONString(treeMenu, SerializerFeature.PrettyFormat, SerializerFeature.WriteMapNullValue,SerializerFeature.WriteDateUseDateFormat);
System.out.println("使用阿里的FastJson:"+s);
具体解析返回值:
使用阿里的FastJson:[{"id":"0","menuName":"小麦系统管理","pid":null,"subMenu":[{"id":"1","menuName":"首页","pid":"0","subMenu":null},{"id":"2","menuName":"用户管理","pid":"0","subMenu":[{"id":"21","menuName":"用户增加","pid":"2","subMenu":null},{"id":"22","menuName":"用户修改","pid":"2","subMenu":null},{"id":"23","menuName":"用户删除","pid":"2","subMenu":[{"id":"231","menuName":"用户恢复","pid":"23","subMenu":[{"id":"2311","menuName":"用户恢复-load","pid":"231","subMenu":null}]}]}]},{"id":"3","menuName":"菜单管理","pid":"0","subMenu":[{"id":"31","menuName":"菜单增加","pid":"3","subMenu":null}]}]}]
主要区别是:
以上就是菜单树的生成以及俩种Json的解析区别!
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
