最近在项目开发过程中遇到一个问题,前台需要用到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;
}
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列表