基本场景就是,java将从数据库中查询的数据拼成树形json结构,供前端插件进行展示
直接百度就能搜到很多相关文章,但是没看到有什么理想的。搜这个的人大部分只是想找个工具类,粘项目里简单改两下直接用的,我简单翻了几页没看到好用的代码,没办法自己写吧。
功能预期结果
对于这样的数据
List
期望得到这样的json结果
准备
添加json包
com.alibaba fastjson 1.2.49
未进行封装的实现
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.alibaba.fastjson.JSONArray;
public class Test05 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Test05 util = new Test05();
List list = util.queryData();//模拟从数据库获取数据
List result = util.getTreeObj(list);//拼接json格式java对象
JSONArray json = new JSONArray(result);
System.out.println(json);
}
public List getTreeObj(List list){
List rootList = new ArrayList();
for(Map item: list){
if(item.get("parent_id") == null || (item.get("parent_id") + "").length() == 0){
rootList.add(new TreeObj(item.get("id"), new ArrayList(), item.get("data") + "", item));
}
}
for(TreeObj item: rootList){
this.dp(item, list);
}
return rootList;
}
private void dp(TreeObj node, List allList){
for(Map item: allList){
if(node.getId().equals(item.get("parent_id"))){
node.getChildren()
.add(new TreeObj(item.get("id"), new ArrayList(), item.get("data") + "", item));
}
}
if(node.getChildren().size() > 0){
for(TreeObj item: node.getChildren()){
this.dp(item, allList);
}
}
}
public List queryData(){
List list = new ArrayList();
list.add(new HashMap(){{this.put("id", "1");this.put("parent_id", "");this.put("data", "11");}});
list.add(new HashMap(){{this.put("id", "2");this.put("parent_id", "1");this.put("data", "22");}});
list.add(new HashMap(){{this.put("id", "3");this.put("parent_id", "2");this.put("data", "33");}});
list.add(new HashMap(){{this.put("id", "4");this.put("parent_id", "1");this.put("data", "44");}});
list.add(new HashMap(){{this.put("id", "5");this.put("parent_id", "2");this.put("data", "55");}});
return list;
}
}
用抽象类和泛型做了简单的封装,支持任意类型的结果集,并可以自定义根节点、父子关系和参数的设置
import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import com.alibaba.fastjson.JSONArray; public abstract class Test06{ public static void main(String[] args) { // TODO Auto-generated method stub Test06 util = new Test06 () { @Override public boolean isRoot(Map obj) { // TODO Auto-generated method stub return obj.get("parent_id") == null || (obj.get("parent_id") + "").length() == 0; } @Override public boolean isChildren(Map thisObj, Map loopObj) { // TODO Auto-generated method stub return thisObj.get("id").equals(loopObj.get("parent_id")); } @Override public Object getId(Map obj) { // TODO Auto-generated method stub return obj.get("id"); } @Override public String getText(Map obj) { // TODO Auto-generated method stub return obj.get("data") + ""; } }; List list = util.queryData();//模拟从数据库获取数据 List result = util.getTreeObj(list);//拼接json格式java对象 JSONArray json = new JSONArray(result); System.out.println(json); } public abstract boolean isRoot(T obj); public abstract boolean isChildren(T thisObj, T loopObj); public abstract Object getId(T obj); public abstract String getText(T obj); public List getTreeObj(List list){ List rootList = new ArrayList(); for(T item: list){ if(this.isRoot(item)){ rootList.add(new TreeObj(this.getId(item), new ArrayList (), this.getText(item), item)); } } for(TreeObj item: rootList){ this.dp(item, list); } return rootList; } private void dp(TreeObj node, List allList){ for(T item: allList){ if(this.isChildren((T)node.getData(), item)){ node.getChildren() .add(new TreeObj(this.getId(item), new ArrayList (), this.getText(item), item)); } } if(node.getChildren().size() > 0){ for(TreeObj item: node.getChildren()){ this.dp(item, allList); } } } public List queryData(){ List list = new ArrayList (); list.add(new HashMap(){{this.put("id", "1");this.put("parent_id", "");this.put("data", "11");}}); list.add(new HashMap(){{this.put("id", "2");this.put("parent_id", "1");this.put("data", "22");}}); list.add(new HashMap(){{this.put("id", "3");this.put("parent_id", "2");this.put("data", "33");}}); list.add(new HashMap(){{this.put("id", "4");this.put("parent_id", "1");this.put("data", "44");}}); list.add(new HashMap(){{this.put("id", "5");this.put("parent_id", "2");this.put("data", "55");}}); return list; } }



