java拼接树形json结构

基本场景就是,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;
	}

}
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值