部门、子部门如何使用递归方式构成json传给前端

假设数据库中部门表如下:

部门id 部门名称 上级部门id
1 a 0
2 b 1
3 c 7
4 d 1
5 e 2
6 f 5
7 g 1
8 h 9
9 i 7
10 j 8

假设顶级部门的上级部门为0。
现在我们想要将上述表结构转换为下面的json传递给前端,该如何转换呢?

{
    "name":"a",
    "subDeptList":[
        {
            "name":"b",
            "subDeptList":[
                {
                    "name":"e",
                    "subDeptList":[
                        {
                            "name":"f",
                            "subDeptList":[

                            ]
                        }
                    ]
                }
            ]
        },
        {
            "name":"d",
            "subDeptList":[

            ]
        },
        {
            "name":"g",
            "subDeptList":[
                {
                    "name":"c",
                    "subDeptList":[

                    ]
                },
                {
                    "name":"i",
                    "subDeptList":[
                        {
                            "name":"h",
                            "subDeptList":[
                                {
                                    "name":"j",
                                    "subDeptList":[

                                    ]
                                }
                            ]
                        }
                    ]
                }
            ]
        }
    ]
}

首先准备我们数据库中表结构类型的domain对象:

package per.yushang.domain;

public class DBDepartment {
    private String id;
    private String name;
    private String superId;

    public DBDepartment() {
    }

    public DBDepartment(String id, String name, String superId) {
        this.id = id;
        this.name = name;
        this.superId = superId;
    }

    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 getSuperId() {
        return superId;
    }

    public void setSuperId(String superId) {
        this.superId = superId;
    }
}

接着再准备我们想传递给前端的数据类型vo:

package per.yushang.domain;

import java.util.List;

public class Department {
    private String name;// 部门名称
    private List<Department> subDeptList;// 子部门集合

    public Department(String name, List<Department> subDeptList) {
        this.name = name;
        this.subDeptList = subDeptList;
    }

    public Department() {
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public List<Department> getSubDeptList() {
        return subDeptList;
    }

    public void setSubDeptList(List<Department> subDeptList) {
        this.subDeptList = subDeptList;
    }

    @Override
    public String toString() {
        return "Department{" +
                "name='" + name + '\'' +
                ", subDeptList=" + subDeptList +
                '}';
    }
}

因为懒得连数据库表了,这里用工具类模拟数据库查询到的部门列表:

package per.yushang.data;

import per.yushang.domain.DBDepartment;

import java.util.ArrayList;
import java.util.List;

public class PreparedData {

    public static List<DBDepartment> getData(){
        List<DBDepartment> depts = new ArrayList<>();
        DBDepartment dept0 = new DBDepartment("1","a","0");
        DBDepartment dept1 = new DBDepartment("2","b","1");
        DBDepartment dept2 = new DBDepartment("3","c","7");
        DBDepartment dept3 = new DBDepartment("4","d","1");
        DBDepartment dept4 = new DBDepartment("5","e","2");
        DBDepartment dept5 = new DBDepartment("6","f","5");
        DBDepartment dept6 = new DBDepartment("7","g","1");
        DBDepartment dept7 = new DBDepartment("8","h","9");
        DBDepartment dept8 = new DBDepartment("9","i","7");
        DBDepartment dept9 = new DBDepartment("10","j","8");
        depts.add(dept0);
        depts.add(dept1);
        depts.add(dept2);
        depts.add(dept3);
        depts.add(dept4);
        depts.add(dept5);
        depts.add(dept6);
        depts.add(dept7);
        depts.add(dept8);
        depts.add(dept9);
        return depts;
    }
}

最后就是运用递归进行转换:

package per.yushang.test;

import com.google.gson.Gson;
import per.yushang.data.PreparedData;
import per.yushang.domain.DBDepartment;
import per.yushang.domain.Department;

import java.util.ArrayList;
import java.util.List;

public class TestMain {

    /**
     * 获取当前部门下一级的部门列表
     * @param superId 当前部门的id
     * @param dbDepartments 数据库查询到的部门列表
     * @return 数据库表结构的子部门集合
     */
    public List<DBDepartment> getSub(String superId,List<DBDepartment> dbDepartments){
        List<DBDepartment> subList = new ArrayList<>();
        // 遍历数据库查询到的部门列表,看看每个部门的上级部门id是不是传入的这个部门id
        for(DBDepartment dbDepartment:dbDepartments){
            if (dbDepartment.getSuperId().equals(superId)){
                subList.add(dbDepartment);
            }
        }
        return subList;
    }

    /**
     * 获取数据库表中的顶级部门
     * @param dbDepartments
     * @return
     */
    public DBDepartment findRoot(List<DBDepartment> dbDepartments){
        for(DBDepartment dept:dbDepartments){
            // 我们假设上级部门id为0的就是顶级部门
            if (dept.getSuperId().equals("0")){
                return dept;
            }
        }
        return null;
    }

    /**
     * 主要逻辑,递归在这
     * @param root
     * @param dbDepartments
     * @return 返回的是所传入数据库表结构的部门所对应vo类型结构的部门
     */
    public Department convert(DBDepartment root,List<DBDepartment> dbDepartments){
        // 首先判断给的根部门是不是null,是null,我觉得你在逗我,我给你个null
        if (root==null) return null;
        // 获取传入根部门的子部门集合
        List<DBDepartment> subList = getSub(root.getId(),dbDepartments);
        // 构建当前这个根部门的vo数据
        Department department = new Department();
        department.setName(root.getName());
        // 到这还需要设置根部门的子部门集合
        List<Department> subs = new ArrayList<>();
        // 如果集合不为空,则表明这个根部门有子部门
        if (!subList.isEmpty()){
            for (DBDepartment dbDepartment:subList){
                // 递归
                Department dd = convert(dbDepartment,dbDepartments);
                subs.add(dd);
            }
        }
        department.setSubDeptList(subs);
        return department;
    }

    // 测试
    public static void main(String[] args) {
        TestMain testMain = new TestMain();
        List<DBDepartment> dbDepartments = PreparedData.getData();
        DBDepartment root = testMain.findRoot(dbDepartments);
        Department dept = testMain.convert(root,dbDepartments);
        System.out.println(dept);
        Gson gson = new Gson();
        String json = gson.toJson(dept);
        System.out.println(json);
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,793评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,567评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,342评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,825评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,814评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,680评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,033评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,687评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,175评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,668评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,775评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,419评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,020评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,206评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,092评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,510评论 2 343