最近一直和json打交道,对于树形数据我一般都是递归操作。
思路:
/**
* 需求:将数据库中数据转化为json tree数据格式
* 步骤:1.将数据通过id找到父子关系,建立tree
* 2.将tree转换为json格式
* 需要写两个递归函数
*/
代码:
public static Map<Column_manager,Map> inflateTreeMap(Map<Column_manager,Map> map,Column_manager cm){
if(cm.getPid()==-1){//根节点
map.put(cm, null);
return map;
}else{
for(Entry<Column_manager,Map> entry:map.entrySet()){
if(entry.getValue()!=null){ //如果有子节点
if(entry.getKey().getId()==cm.getPid()){//本节点是否就是寻找的节点
entry.getValue().put(cm, null);
break;
}else{
map = inflateTreeMap(entry.getValue(),cm);
}
}else{//如果没有子节点
if(entry.getKey().getId()==cm.getPid()){
Map<Column_manager,Map> m = new HashMap<Column_manager,Map>();
m.put(cm, null);
entry.setValue(m);
break;
}
}
}
return map;
}
}
public static StringBuffer treeToJson(Map<Column_manager,Map> map,StringBuffer sb){
sb.append("[");
for(Entry<Column_manager,Map> entry : map.entrySet()){
if(entry.getValue()!=null){//有下级节点
sb.append("{");
sb.append("\"id\":");
sb.append(entry.getKey().getId());
sb.append(",");
sb.append("\"name\":");
sb.append("\""+entry.getKey().getColumnName()+"\"");
sb.append(",");
sb.append("\"person\":");
sb.append(entry.getKey().getCheckId());
sb.append(",");
sb.append("\"children\":");
sb = treeToJson(entry.getValue(),sb);
sb.append("},");
}else{
sb.append("{");
sb.append("\"id\":");
sb.append(entry.getKey().getId());
sb.append(",");
sb.append("\"name\":");
sb.append("\""+entry.getKey().getColumnName()+"\"");
sb.append(",");
sb.append("\"person\":");
sb.append(entry.getKey().getCheckId());
sb.append("},");
}
}
sb.append("]");
int index=0;
int from=0;
while((index = sb.indexOf("},",from))!=-1){ //处理掉多余的,
if(sb.substring(index+2, index+3).equals("]")){
sb = sb.replace(index+1, index+2, "");
}
from+=index;
}
return sb;
}
转换后的json数据:
[{"id":22,"name":"aaa","person":2,"children":[{"id":23,"name":"aa33a","person":2}]},{"id":19,"name":"aaa","person":2,"children":[{"id":20,"name":"aaa","person":2},{"id":21,"name":"aa2a","person":2}]}]