java 树形转换JSON 工具类 / 树形子父级菜单递归 JSON 格式

简介: java 树形转换JSON 工具类 / 树形子父级菜单递归 JSON 格式

实体类:
package tree;
import java.util.List;
/**
 *
 *  2018-11-30
 */
public class Menu {
    // 菜单id
    private String id;
    // 菜单名称
    private String name;
    // 父菜单id
    private String parentId;
    // 菜单url
    private String url;
    // 菜单图标
    private String icon;
    // 菜单顺序
    private int order;
    // 子菜单
    private List<Menu> childMenus;
  public Menu(String id, String name, String parentId) {
    super();
    this.id = id;
    this.name = name;
    this.parentId = parentId;
  }
  @Override
  public String toString() {
    return "Menu [id=" + id + ", name=" + name + ", parentId=" + parentId
        + ", url=" + url + ", icon=" + icon + ", order=" + order
        + ", childMenus=" + childMenus + "]";
  }
  public String getId() {
    return id;
  }
  public void setId(String id) {
    this.id = id;
  }
  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }
  public String getParentId() {
    return parentId;
  }
  public void setParentId(String parentId) {
    this.parentId = parentId;
  }
  public String getUrl() {
    return url;
  }
  public void setUrl(String url) {
    this.url = url;
  }
  public String getIcon() {
    return icon;
  }
  public void setIcon(String icon) {
    this.icon = icon;
  }
  public int getOrder() {
    return order;
  }
  public void setOrder(int order) {
    this.order = order;
  }
  public List<Menu> getChildMenus() {
    return childMenus;
  }
  public void setChildMenus(List<Menu> childMenus) {
    this.childMenus = childMenus;
  }
}

以下为工具类:

package com.aqueduct.base.common.util;

import java.util.ArrayList; import java.util.HashMap; import

java.util.List; import java.util.Map;

import javax.annotation.Resource;

import com.alibaba.fastjson.JSON; import

com.aqueduct.base.entity.system.Menu; import

com.aqueduct.base.service.system.menu.MenuManager;

public class ZTreeInit{
  @Resource(name="menuService")
  private static MenuManager menuService;

/** * 初始化数据 * * @return */

public static List<Menu> initData(){
  List<Menu> treeData = new ArrayList<Menu>();
  treeData.add(new Menu("1","1","0"));
  treeData.add(new Menu("2","2","1"));
  treeData.add(new Menu("3","3","1"));
  treeData.add(new Menu("4","4","2"));
  treeData.add(new Menu("5","5","0"));
  treeData.add(new Menu("6","6","2"));
  treeData.add(new Menu("7","7","2"));
  treeData.add(new Menu("8","8","3"));
  treeData.add(new Menu("9","9","10"));
  treeData.add(new Menu("10","10","6"));
  treeData.add(new Menu("11","11","7"));
  return treeData;
}

/** * 子菜单递归 * * @param id * @param rootMenu * @return */

public static List<Menu> getChild(String id, List<Menu> rootMenu) {
  // 子菜单
  List<Menu> childList = new ArrayList<>();
  for (Menu menu : rootMenu) {
    // 遍历所有节点,将父菜单id与传过来的id比较
    if (menu.getPARENT_ID().equals(id)) {
      childList.add(menu);
    }
  }
  // 把子菜单的子菜单再循环一遍
  for (Menu menu : childList) {
    menu.setSubMenu(getChild(menu.getMENU_ID(), rootMenu));// 递归
  }
  // 判断递归结束
  if (childList.size() == 0) {
    return null;
  }
  return childList;
}

/** * @param args * @throws Exception */

  public static void main(String[] args) throws Exception {
    // TODO Auto-generated method stub
    List<Menu> treeData = menuService.listAllMenuQx("0");//获取所有菜单; // 原始数据
    // 查看结果
    for (Menu menu : treeData) {
//       System.out.println(menu.toString());
    }
    List<Menu> menuList = new ArrayList<Menu>(); // 树递归
    // 先找到所有的一级菜单
    for (int i = 0; i < treeData.size(); i++) {
      // 一级菜单父ID为0
      if (treeData.get(i).getPARENT_ID().equals("0")) {
        menuList.add(treeData.get(i));
      }
    }
    // 为一级菜单设置子菜单,getChild是递归调用的
    for (Menu menu : menuList) {
      menu.setSubMenu(getChild(menu.getMENU_ID(), treeData));
    }
    Map<String, Object> jsonMap = new HashMap<String, Object>();
    jsonMap.put("menu", menuList);
    System.out.println(JSON.toJSONString(menuList));
//    buildMenu(menuList);
//    System.out.println(str);
  }

/** * 遍历菜单 * * @param arr * @return */

  public static String str = "";
  public static String buildMenu(List<Menu> arr) {
    for (int i = 0; i < arr.size(); i++) {
      /*str += "<li>";
      str += "<a href='javascript:;'>" + "<cite>"
          + arr.get(i).getMENU_NAME() + "</cite>"
          + "<i class='iconfont nav_right'>"
          + arr.get(i).getMENU_ICON() + "</i>" + "</a>";*/
      // 存在子菜单 递归
      if (arr.get(i).getSubMenu() != null
          && arr.get(i).getSubMenu().size() > 0) {
//        str += "<ul>";
        buildMenu(arr.get(i).getSubMenu()); // 递归
//        str += "</ul>";
      }
      /*str += "</li>";*/
    }
    return str;
  }
}

数据输出:

47032dbf03ee8bdabd16c7705dec17b.png

目录
相关文章
|
1月前
|
JSON 前端开发 Java
Json格式数据解析
Json格式数据解析
|
5天前
|
存储 算法 安全
Java工具类
Java工具类
27 5
Java工具类
|
11天前
|
存储 JSON DataWorks
DataWorks产品使用合集之DataWorks将 MongoDB 中的数组类型写入到 DataWorks 的单个字段时,表示为字符串格式而非 JSON 格式如何解决
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
24 3
|
22天前
|
监控 安全 Java
【JavaEE多线程】深入解析Java并发工具类与应用实践
【JavaEE多线程】深入解析Java并发工具类与应用实践
33 1
|
22天前
|
安全 Java
深入理解 Java 多线程和并发工具类
【4月更文挑战第19天】本文探讨了Java多线程和并发工具类在实现高性能应用程序中的关键作用。通过继承`Thread`或实现`Runnable`创建线程,利用`Executors`管理线程池,以及使用`Semaphore`、`CountDownLatch`和`CyclicBarrier`进行线程同步。保证线程安全、实现线程协作和性能调优(如设置线程池大小、避免不必要同步)是重要环节。理解并恰当运用这些工具能提升程序效率和可靠性。
|
22天前
|
Java
java日期工具类(DateUtil)
java日期工具类(DateUtil)
|
26天前
|
存储 JSON NoSQL
MongoDB的文档存储格式BSON和JSON的区别
MongoDB的文档存储格式BSON和JSON的区别
|
1月前
|
存储 缓存 Java
java多线程之线程通信工具类
java多线程之线程通信工具类
|
1月前
|
XML JSON JavaScript
Java中XML和JSON的比较与应用指南
本文对比了Java中XML和JSON的使用,XML以自我描述性和可扩展性著称,适合结构复杂、需验证的场景,但语法冗长。JSON结构简洁,适用于轻量级数据交换,但不支持命名空间。在Java中,处理XML可使用DOM、SAX解析器或XPath,而JSON可借助GSON、Jackson库。根据需求选择合适格式,注意安全、性能和可读性。
28 0
|
1月前
|
缓存 算法 安全
Java并发编程学习8-同步工具类
【4月更文挑战第2天】本篇介绍一下Java平台类库下的常用的同步工具类(闭锁、Future、信号量和栅栏)
21 2
Java并发编程学习8-同步工具类