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;
    }
posted @ 2022-12-30 13:15  [奋斗]  阅读(152)  评论(0编辑  收藏  举报