Java遞迴拼接json樹形結構
阿新 • • 發佈:2018-12-09
最近在專案開發過程中遇到一個問題,前臺需要用到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的拼接。
參考資料: