将json转成树状结构

import com.alibaba.fastjson.JSONArray;

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


public class Test {
    public static void main(String[] args) {
        String arrayStr = "[{\"a\":1,\"b\":\"一级 1\",\"c\":0}, {\"a\":2,\"b\":\"一级 2\",\"c\":0}, {\"a\":3,\"b\":\"一级 3\",\"c\":0}, {\"a\":4,\"b\":\"二级 1-1\",\"c\":1},\n" +
                " {\"a\":5,\"b\":\"二级 2-1\",\"c\":2}, {\"a\":6,\"b\":\"二级 2-2\",\"c\":2}, {\"a\":7,\"b\":\"二级 3-1\",\"c\":3}, {\"a\":8,\"b\":\"二级 3-2\",\"c\":3}, \n" +
                " {\"a\":9,\"b\":\"三级 1-1-1\",\"c\":4}, {\"a\":10,\"b\":\"三级 2-1-1\",\"c\":5}, {\"a\":11,\"b\":\"三级 2-2-1\",\"c\":6}, {\"a\":12,\"b\":\"三级 3-1-1\",\"c\":7}, \n" +
                " {\"a\":13,\"b\":\"三级 3-2-1\",\"c\":8} ] ";
        List<Data> treeData = getTreeData(arrayStr);
        for (Data treeDatum : treeData) {
            System.out.println(treeDatum);
        }
    }

    public static List<Data> getTreeData(String arrayStr){
        // json转集合
        List<Data> datas = JSONArray.parseArray(arrayStr, Data.class);
        List<Data> rtList = doGetTreeData(datas);
        return rtList;
    }

    private static List<Data> doGetTreeData(List<Data> datas) {
        List<Data> rtList = new ArrayList<>();
        List<Data> ctList = new ArrayList<>();
        for (Data data : datas) {
            // 获取树id
            String treeNo = data.getB().split(" ")[1];
            data.setSid(treeNo);
            if (treeNo.length() > 2) {
                data.setPid(treeNo.substring(0,treeNo.length() -2));
            }
            ctList.add(data);
        }
        for (Data data : ctList) {
            if (data.getPid() == null) {
                // 获取树一级元素
                rtList.add(data);
            }
            // 设置元素子集合
            data.setChildren(getChildren(ctList,data.getSid()));
        }
        return rtList;
    }

    public static List<Data> getChildren(List<Data> list,String pid){
        List<Data> cList = new ArrayList<>();
        for (Data data : list) {
            if(pid.equals(data.getPid())){
                cList.add(data);
            }
        }
        return cList;
    }

}


class Data {
    private Integer a;
    private String b;
    private Integer c;
    /**
     * 树id
     */
    private String sid;
    /**
     * 父id
     */
    private String pid;
    private List<Data> children;

    @Override
    public String toString() {
        return "Data{" +
                "a=" + a +
                ", b='" + b + '\'' +
                ", c=" + c +
                ", sid='" + sid + '\'' +
                ", pid='" + pid + '\'' +
                ", children=" + children +
                '}';
    }

    public String getSid() {
        return sid;
    }

    public void setSid(String sid) {
        this.sid = sid;
    }

    public String getPid() {
        return pid;
    }

    public void setPid(String pid) {
        this.pid = pid;
    }

    public Integer getA() {
        return a;
    }

    public void setA(Integer a) {
        this.a = a;
    }

    public String getB() {
        return b;
    }

    public void setB(String b) {
        this.b = b;
    }

    public Integer getC() {
        return c;
    }

    public void setC(Integer c) {
        this.c = c;
    }

    public List<Data> getChildren() {
        return children;
    }

    public void setChildren(List<Data> children) {
        this.children = children;
    }
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值