springboot 返回多层级关系为json格式给前端(树形层级数据)

后台表是一个类似菜单表,存在自关联的父子关系. 现在想把表数据加工成分级之后的json数据返回给前端.供展示 

 

1:实体

/**
 * <p>
 * 课程科目
 * </p>
 *
 * @author zxz
 * @since 2023-03-14
 */
@TableName("edu_subject")
@JsonInclude(JsonInclude.Include.NON_NULL)  //springboo空字段不做json显示
@ApiModel(value = "EduSubject对象", description = "课程科目")
@Data
@ToString
public class EduSubject implements Serializable {
    private static final long serialVersionUID = 1L;

    @ApiModelProperty("课程类别ID")
    private String id;

    @ApiModelProperty("类别名称")
    private String title;

    @ApiModelProperty("父ID")
    private String parentId;

    @ApiModelProperty("排序字段")
    private Integer sort;

    @ApiModelProperty("创建时间")
    private Date gmtCreate;

    @ApiModelProperty("更新时间")
    private Date gmtModified;

    @TableField(exist=false) //排除字段关系
    private ArrayList<EduSubject> List;
}

2:Controller

@Controller
@RequestMapping("/eduSubject")
@CrossOrigin
public class EduSubjectController {

  @Autowired
  private IEduSubjectService iEduSubjectService;
  @GetMapping("getSubject")
  @ResponseBody
  public ResultMessge getSubject(){
    return iEduSubjectService.getSubject();
  }
}

3:Service


/**
 * <p>
 * 课程科目 服务实现类
 * </p>
 *
 * @author zxz
 * @since 2023-03-14
 */
@Service
public class EduSubjectServiceImpl extends ServiceImpl<EduSubjectMapper, EduSubject> implements IEduSubjectService {

  public ResultMessge getSubject (){
    //所有学科列表 mybatisplus提供的list
    List<EduSubject> list = list();

    //将学科按照父id分类, 放在 <父id,<对应子集合>>的map中
    HashMap<String,ArrayList<EduSubject>> hashMap = new HashMap<>();
    list.stream().forEach(a -> {
      hashMap.computeIfAbsent(a.getParentId(), key -> new ArrayList<EduSubject>()).add(a);
    });

    //从父节点进入开始递归往下找
    listToJson(hashMap,"0");

    //递归完成之后,将父节点的List返回就行了
    return ResultMessge.success().addMap("json",hashMap.get("0"));
  }

  /**
   *
   * @param hashMap 源map
   * @param level levelid
   */
  public void listToJson(HashMap<String,ArrayList<EduSubject>> hashMap,  String level){
    //获得level等级的子集合
    ArrayList<EduSubject> list = hashMap.get(level);
    list.stream().forEach(e -> {
      ArrayList<EduSubject> eduSubjectlist = hashMap.get(e.getId()); //获得level层级的孙集合
      e.setList(eduSubjectlist); //子集合设置到父
      if(eduSubjectlist!=null&&eduSubjectlist.size()!=0){
        eduSubjectlist.stream().forEach(es -> {   //子集合在去找孙集合然后递归
          listToJson(hashMap,es.getParentId());
        });
      }
    });
  }
}

4:表数据

 别的都是2个层级, 新增了一条记录是第3个层级. 前端开发--html/css--测试

 5:ResultMessge

package com.zxz.entiry;

import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.core.JsonFactory;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.Data;

import java.text.SimpleDateFormat;
import java.util.HashMap;
import java.util.Map;

/**
 * @auther nnzxz
 * @create 2023-03-12
 * @used do something
 */
@Data
public class ResultMessge {
  final static int SUCESSCODE=20000 ;
  final static int DEFEATCODE=20001 ;

  public Boolean flag;
  public int code;
  private String message;
  private Map<String,Object> data;

  public ResultMessge addMap(String key,Object value){
    if(this.data==null){
      this.data=new HashMap<>();
    }
    this.data.put(key,value);
    return this;
  }
  public ResultMessge() {
  }

  public ResultMessge(Boolean flag, int code, String message, Map<String,Object>  items) {
    this.flag = flag;
    this.code = code;
    this.message = message;
    this.data = items;
  }

  public static ResultMessge success(){
    return new ResultMessge(true,SUCESSCODE,"成功",null);
  }

  public static ResultMessge defeat(){
    return new ResultMessge(false,DEFEATCODE,"失败",null);
  }
}

6: 效果

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
以下是一个使用SpringBoot实现树形结构的代码示例: 首先,我们需要定义一个树形结构的实体类,如下所示: ```java public class TreeNode { private Long id; private String name; private Long parentId; private List<TreeNode> children; // 省略getter和setter方法 } ``` 接下来,我们需要定义一个服务来获取树形结构数据,并将其转换为树形结构。这里我们使用递归算法实现转换: ```java @Service public class TreeService { @Autowired private TreeNodeMapper treeNodeMapper; public List<TreeNode> getTree() { List<TreeNode> nodeList = treeNodeMapper.findAll(); List<TreeNode> treeList = new ArrayList<>(); for (TreeNode node : nodeList) { if (node.getParentId() == null) { treeList.add(findChildren(node, nodeList)); } } return treeList; } private TreeNode findChildren(TreeNode parentNode, List<TreeNode> nodeList) { for (TreeNode node : nodeList) { if (parentNode.getId().equals(node.getParentId())) { if (parentNode.getChildren() == null) { parentNode.setChildren(new ArrayList<>()); } parentNode.getChildren().add(findChildren(node, nodeList)); } } return parentNode; } } ``` 最后,我们需要在Controller中调用服务,并返回树形结构数据: ```java @RestController public class TreeController { @Autowired private TreeService treeService; @GetMapping("/tree") public List<TreeNode> getTree() { return treeService.getTree(); } } ``` 这样,我们就可以通过访问`/tree`接口获取树形结构数据了。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值