基本场景就是,java将从数据库中查询的数据拼成树形json结构,供前端插件进行展示
直接百度就能搜到很多相关文章,但是没看到有什么理想的。搜这个的人大部分只是想找个工具类,粘项目里简单改两下直接用的,我简单翻了几页没看到好用的代码,没办法自己写吧。
功能预期结果
对于这样的数据
List<Map> list = new ArrayList<Map>();
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");}});
期望得到这样的json结果
准备
添加json包
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.49</version>
</dependency>
未进行封装的实现
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<Map> list = util.queryData();//模拟从数据库获取数据
List result = util.getTreeObj(list);//拼接json格式java对象
JSONArray json = new JSONArray(result);
System.out.println(json);
}
public List<TreeObj> getTreeObj(List<Map> list){
List<TreeObj> 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<TreeObj>(), item.get("data") + "", item));
}
}
for(TreeObj item: rootList){
this.dp(item, list);
}
return rootList;
}
private void dp(TreeObj node, List<Map> allList){
for(Map item: allList){
if(node.getId().equals(item.get("parent_id"))){
node.getChildren()
.add(new TreeObj(item.get("id"), new ArrayList<TreeObj>(), item.get("data") + "", item));
}
}
if(node.getChildren().size() > 0){
for(TreeObj item: node.getChildren()){
this.dp(item, allList);
}
}
}
public List<Map> queryData(){
List<Map> list = new ArrayList<Map>();
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<T> {
public static void main(String[] args) {
// TODO Auto-generated method stub
Test06 util = new Test06<Map>() {
@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<Map> 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<TreeObj> getTreeObj(List<T> list){
List<TreeObj> rootList = new ArrayList();
for(T item: list){
if(this.isRoot(item)){
rootList.add(new TreeObj(this.getId(item), new ArrayList<TreeObj>(), this.getText(item), item));
}
}
for(TreeObj item: rootList){
this.dp(item, list);
}
return rootList;
}
private void dp(TreeObj node, List<T> allList){
for(T item: allList){
if(this.isChildren((T)node.getData(), item)){
node.getChildren()
.add(new TreeObj(this.getId(item), new ArrayList<TreeObj>(), this.getText(item), item));
}
}
if(node.getChildren().size() > 0){
for(TreeObj item: node.getChildren()){
this.dp(item, allList);
}
}
}
public List<Map> queryData(){
List<Map> list = new ArrayList<Map>();
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;
}
}