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文件,如下所示:
<!-- 使用谷歌的Gson -->
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.2.4</version>
</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文件,如下所示:
<!-- 使用阿里的FastJson -->
<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>2.0.1</version>
</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的解析区别!