list转json tree的工具类
package com.glodon.safety.contingency.job; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import java.util.*; /** * @Description 通用的list转json tree的工具类 * @Author songwp * @Date 2022/12/30 12:59 * @Version 1.0.0 **/ public class CommonTreeUtil { /** - listToTree - <p>方法说明<p> - 将JSONArray数组转为树状结构 - @param arr 需要转化的数据 - @param id 数据唯一的标识键值 - @param pid 父id唯一标识键值 - @param child 子节点键值 - @return JSONArray */ public static JSONArray listToTree(JSONArray arr, String id, String pid, String child){ JSONArray r = new JSONArray(); JSONObject hash = new JSONObject(); //将数组转为Object的形式,key为数组中的id for(int i=0;i<arr.size();i++){ JSONObject json = (JSONObject) arr.get(i); hash.put(json.getString(id), json); } //遍历结果集 for(int j=0;j<arr.size();j++){ //单条记录 JSONObject aVal = (JSONObject) arr.get(j); //在hash中取出key为单条记录中pid的值 JSONObject hashVP = (JSONObject) hash.get(aVal.get(pid).toString()); //如果记录的pid存在,则说明它有父节点,将她添加到孩子节点的集合中 if(hashVP!=null){ //检查是否有child属性 if(hashVP.get(child)!=null){ JSONArray ch = (JSONArray) hashVP.get(child); ch.add(aVal); hashVP.put(child, ch); }else{ JSONArray ch = new JSONArray(); ch.add(aVal); hashVP.put(child, ch); } }else{ r.add(aVal); } } return r; } public static void main(String[] args) { Map map = new HashMap(); map.put("id","1"); map.put("parentId","0"); map.put("name","陕西省"); Map map1 = new HashMap(); map1.put("id","2"); map1.put("parentId","1"); map1.put("name","西安市"); Map map2 = new HashMap(); map2.put("id","3"); map2.put("parentId","2"); map2.put("name","雁塔区"); Map map3 = new HashMap(); map3.put("id","4"); map3.put("parentId","1"); map3.put("name","咸阳市"); List<Map> mapList = Arrays.asList(map, map1, map2, map3); JSONArray result = CommonTreeUtil.listToTree(JSONArray.parseArray(JSON.toJSONString(mapList)),"id","parentId","children"); System.out.println(result); } }
控制台输出:
[ { "children":[ { "children":[ { "name":"雁塔区", "id":"3", "parentId":"2" } ], "name":"西安市", "id":"2", "parentId":"1" }, { "name":"咸阳市", "id":"4", "parentId":"1" } ], "name":"陕西省", "id":"1", "parentId":"0" } ]
方法拓展
public List<DictTypeVO> getTree() { List<DictTypeVO> dictTypeVOS = DictTypeDomainService().findAllList(); return buildTreeUseList(dictTypeVOS, 0); } /** * 使用递归构建树结构-使用foreach转换 * @param treeList * @param id * @return */ public static List<DictTypeVO> buildTreeUseList(List<DictTypeVO> treeList,long id ) { //收集传递的集合中父id相同的TreeNode List<DictTypeVO> children = new ArrayList<>(); for (DictTypeVO treeNode : treeList) { //判断该节点的父id,是否与传入的父id相同,相同则递归设置其孩子节点,并将该节点放入children集合中 if(treeNode.getParentId() == id){ //递归设置其孩子节点 treeNode.setChildren(buildTreeUseList(treeList, treeNode.getId())); //放入children集合 children.add(treeNode); } } return children; }
古今成大事者,不唯有超世之才,必有坚韧不拔之志!