需求:需要从数据库查询树型结构的数据,并将其转换处理为树型结构的数据类型。这里为了简单,就不从数据库中查数据了,直接使用List造一些数据进行模拟
代码实现:
aaa
实体类:
@JSONField这个注解大概用法看:https://www.cnblogs.com/xieegai/p/8242549.html
https://blog.csdn.net/fxbin123/article/details/78465342
public class Menu { @JSONField(ordinal=0) //这个是设置序列化后显示的优先级(fastJson中的) private String id; @JSONField(ordinal=1,name = "abc") private String parentId; @JSONField(ordinal=2) private String text; @JSONField(ordinal=3) private String url; @JSONField(ordinal=4) private String yxbz; @JSONField(ordinal=5) private List<Menu> children; public Menu(String id,String parentId,String text,String url,String yxbz) { this.id=id; this.parentId=parentId; this.text=text; this.url=url; this.yxbz=yxbz; } //get、set方法 }
树型结构转换工具类:
public class MenuTree { //查询到的所有原始数据 private List<Menu> menuList = new ArrayList<Menu>(); public MenuTree(List<Menu> menuList) { this.menuList=menuList; } //建立树形结构 public List<Menu> builTree(){ //用来存储处理好的数据 List<Menu> treeMenus =new ArrayList<Menu>(); //先利用getRootNode方法获取根节点,然后根据根节点调用递归方法获取到各个根节点对应的字节点,将其放进上面的List中去 for(Menu menuNode : getRootNode()) { menuNode=buildChilTree(menuNode); treeMenus.add(menuNode); } return treeMenus; } //递归,建立子树形结构 private Menu buildChilTree(Menu pNode){ //用来存放子节点集合 List<Menu> chilMenus =new ArrayList<Menu>(); //根据根节点,遍历父子节点是根节点的节点出来。然后放进上面的集合中去 //这里递归调用add方法。 for(Menu menuNode : menuList) { if(menuNode.getParentId().equals(pNode.getId())) { chilMenus.add(buildChilTree(menuNode)); } } //最后将递归得到的所有子节点放进根节点的children的属性中去。 pNode.setChildren(chilMenus); return pNode; } //获取根节点 private List<Menu> getRootNode() { List<Menu> rootMenuLists =new ArrayList<Menu>(); for(Menu menuNode : menuList) { if(menuNode.getParentId().equals("0")) { rootMenuLists.add(menuNode); } } return rootMenuLists; } }
造数据并测试:
public class Hello { public static void main(String []args) { List<Menu> menuList= new ArrayList<Menu>(); /*插入一些数据*/ menuList.add(new Menu("GN001D000","0","系统管理","/admin","Y")); menuList.add(new Menu("GN001D100","GN001D000","权限管理","/admin","Y")); menuList.add(new Menu("GN001D110","GN001D100","密码修改","/admin","Y")); menuList.add(new Menu("GN001D120","GN001D100","新加用户","/admin","Y")); menuList.add(new Menu("GN001D200","GN001D000","系统监控","/admin","Y")); menuList.add(new Menu("GN001D210","GN001D200","在线用户","/admin","Y")); menuList.add(new Menu("GN002D000","0","订阅区","/admin","Y")); menuList.add(new Menu("GN003D000","0","未知领域","/admin","Y")); /*让我们创建树*/ MenuTree menuTree =new MenuTree(menuList); menuList=menuTree.builTree(); /*转为json看看效果*/ String jsonOutput= JSON.toJSONString(menuList); System.out.println(jsonOutput); } }
最后查看控制台打印:
将json数据解析后:
树型数据的处理也可以用其他方式,例如sql联表等,但如果此时你不清楚有几级节点/节点的深度是由客户自己录入的,此时用递归就是一种比较好的方式。
aa