栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

java拼接树形json结构

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

java拼接树形json结构

基本场景就是,java将从数据库中查询的数据拼成树形json结构,供前端插件进行展示

直接百度就能搜到很多相关文章,但是没看到有什么理想的。搜这个的人大部分只是想找个工具类,粘项目里简单改两下直接用的,我简单翻了几页没看到好用的代码,没办法自己写吧。

功能预期结果
对于这样的数据

		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");}});

期望得到这样的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;
	}

}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/894995.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号