Java递归拼接json树形结构

最近在项目开发过程中遇到一个问题,前台需要用到echarts组件中的旭日图来显示层级关系,这就需要我将后台Sql查询出来的json数组拼接成多级嵌套的树形结构返回前台 ,类似于

Java递归拼接json树形结构_第1张图片

Java递归拼接json树形结构_第2张图片

而我从数据库中查出来的数据是这样的:

{"prog_level_id_1":"5","prog_level_id_2":"10010","prog_level_id_3":"20400","prog_level_name_1":"生活服务类","prog_level_name_2":"普通商业广告","prog_level_name_3":"家具装饰类","prog_level_name_4":"装饰","prog_level_name_5":"美好生活","prog_level_id_4":"38000","prog_level_id_5":"1100000"}

解决方法:

设计一个类表示属性,存储相关信息

public class ProgNode {

    private String id;
    private String name;

    public ProgNode() {
    }

    public ProgNode(String id, String name, String level) {
        super();
        this.id = id;
        this.name = name;
    }

    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 List getChild(){
        //。。。。。。。部分代码省略
        String prog_id = "**";
        String prog_name = "***";
        String sql = " *****";  //这里的sql根据父级id查找相关的子属性

        JSONArray jsonArray = new JSONArray();
        jsonArray = CrateJDBCUtil.getInstance().executeQuery(sql);
        List progNodes= new ArrayList();
        if(jsonArray.size()>0){
            for (int i = 0;i < jsonArray.size();i++){
                ProgNode node = new ProgNode()
                String progId = jsonArray.getJSONObject(i).getString(prog_id);
                String progName = jsonArray.getJSONObject(i).getString(prog_name);
                if(progId != null && progId != ""){
                    node.setId(progId);
                    node.setName(progName);
                    progNodes.add(node);
                }
            }
        }
        return progNodes;   //返回一个集合
    }
}

然后:我们先查找第一级属性,就是没有上级节点的属性,获取他们的编号,名称

public JSONArray getResult(){

        //查询一级属性id
        String prog1 = "select distinct prog_id_1,prog_name_1\n" +
                "from bm.tplt_monthly_info";

        JSONArray jsonArray = new JSONArray();
        jsonArray = CrateJDBCUtil.getInstance().executeQuery(prog1);

        List progNodes= new ArrayList();
        for (int i = 0;i < jsonArray.size();i++){
            ProgNode node = new ProgNode();
            node.setId(jsonArray.getJSONObject(i).getString("prog_level_id_1"));
            node.setName(jsonArray.getJSONObject(i).getString("prog_level_name_1"));
            progNodes.add(node);
        }

        JSONArray rtJA = new JSONArray();
        rtJA = getChildInfo(progNodes);    //根据一级查找子级
        return rtJA;
}

 递归循环查找子级属性。

public JSONArray getChildInfo(List progNodes){
        JSONArray rtJA = new JSONArray();
        for(ProgNode prog :progNodes){
            int level = Integer.parseInt(prog.getLevel());
            List progList = new ArrayList();
            if(level < 5){
                progList =prog.getChild();//查询该属性下的子属性
            }
            JSONObject jsonObject = new JSONObject();
            jsonObject.put("id",prog.getId());
            jsonObject.put("name",prog.getName());

            if(progList.size()>0){//如果该属性还有子属性,继续做查询,直到该属性没有孩子,也就是最后一个节点
                jsonObject.put("children", getChildInfo(progList));
            }
            rtJA.add(jsonObject);
        }
        return rtJA;
    }

 以上就实现了树形json的拼接。

 

 参考资料:

java递归实现json树结构,附带js实现树结构:子父节点

java+mysql递归拼接树形JSON列表

你可能感兴趣的:(Java)