在前后端分离实际开发过程中,遇到过这样问题就是前端element框架在Tree树形控件的构建需要后端向前端传递的也是树型的json。
以下是官网要求格式:
要求的json格式如下:
[{
"id": "1",
"pId": "0",
"name": "1级节点",
"children": [{
"id": "2",
"pId": "1",
"name": "2级节点",
"children": [{
"id": "3",
"pId": "2",
"name": "3级节点"
}]
}]
}]
但是在数据存储时,这些树型结构数据都会存储为一条条的包含父id的数据。一般情况下后台只会将数据以无结构形式传递至前端,这就导致前端需要重新解析后端传递的数据。
一般后端返回的json格式如下:
[{
"id": "1",
"pId": "0",
"name": "1级节点"
},{
"id": "2",
"pId": "1",
"name": "2级节点"
},{
"id": "3",
"pId": "2",
"name": "3级节点"
}]
为了解决这个问题,本人(后台开发)想用后台代码解决这样的问题,解决思路是:
原数据在后台进行递归处理而得到前端所要求的json格式数据。
import com.alibaba.fastjson.*;
import java.util.*;
public static void main(String[] args){
List<Ztree> ztrees = new ArrayList<>();
for(int i = 0;i < 3;i++){
Ztree ztree = new Ztree();
ztree.setName(i+1+"级节点");
ztree.setpId(Long.valueOf(i));
ztree.setId(Long.valueOf(i+1));
ztrees.add(ztree);
}
//原数据
System.out.println(JSON.toJSONString(ztrees));
//最终结果树
System.out.println(JSON.toJSONString(buildByRecursive(ztrees)));
}
/**
* 使用递归方法建树
*
* @param ztrees 原数据
* @return 最终结果树
*/
public static List<Ztree> buildByRecursive(List<Ztree> ztrees) {
//最终结果
List<Ztree> trees = new ArrayList<Ztree>();
//寻找根节点
for (Ztree ztree : ztrees) {
if (ztree.getpId() == null||ztree.getpId() == 0) {
trees.add(findChildren(ztree,ztrees));
}
}
return trees;
}
/**
* 递归查找子节点
*
* @param ztree 节点
* @param ztrees 原数据
* @return
*/
public static Ztree findChildren(Ztree ztree,List<Ztree> ztrees) {
for (Ztree ztr : ztrees) {
if(ztree.getId().equals(ztr.getpId())) {
if (ztree.getChildren() == null) {
ztree.setChildren(new ArrayList<Ztree>());
}
ztree.getChildren().add(findChildren(ztr,ztrees));
}
}
return ztree;
}
Ztree.class
import java.util.*;
public class Ztree
{
/** 节点ID */
private Long id;
/** 节点父ID */
private Long pId;
/** 节点名称 */
private String name;
/** 子对象 */
private List<Ztree> children;
public Long getId()
{
return id;
}
public void setId(Long id)
{
this.id = id;
}
public Long getpId()
{
return pId;
}
public void setpId(Long pId)
{
this.pId = pId;
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public List<Ztree> getChildren() {
return children;
}
public void setChildren(List<Ztree> children) {
this.children = children;
}
}