1. 程式人生 > >Java遞迴拼接json樹形結構

Java遞迴拼接json樹形結構

最近在專案開發過程中遇到一個問題,前臺需要用到echarts元件中的旭日圖來顯示層級關係,這就需要我將後臺Sql查詢出來的json陣列拼接成多級巢狀的樹形結構返回前臺 ,類似於

而我從資料庫中查出來的資料時這樣的:

{"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;
        this.level = level;
    }

    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 sql = " *****";  //這裡的sql根據父級id查詢相關的子屬性

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

然後:我們先查詢第一級屬性,就是沒有父節點的屬性,獲取他們的編號,名稱

public JSONArray getResult(){

        //查詢一級屬性id
        String prog1 = "select distinct prog_level_id_1,prog_level_name_1\n" +
                "from bm.tplt_monthly_info";

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

        List<ProgNode> progNodes= new ArrayList<ProgNode>();
        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<ProgNode> progNodes){
        JSONArray rtJA = new JSONArray();
        for(ProgNode prog :progNodes){
            int level = Integer.parseInt(prog.getLevel());
            List<ProgNode> progList = new ArrayList<ProgNode>();
            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的拼接。

 參考資料: