java后端把数据转换为树,map递归生成json树,返回给前端(后台转换)

java后端把数据转换为树,map递归生成json树,返回给前端(后台转换)

 2023-12-10 java编程 跟版网 207

首先,需要明确一下这个过程的流程和目的:将后端获得的数据转换为树形结构,再通过递归生成 JSON 树,并返回给前端。下面我们将详细讲解这个过程。

首先,需要明确一下这个过程的流程和目的:将后端获得的数据转换为树形结构,再通过递归生成 JSON 树,并返回给前端。下面我们将详细讲解这个过程。

1. 将数据转换为树形结构

首先,需要将后端的数据进行转换,变成树形结构。可以使用递归来完成这个过程。

具体实现方式如下:首先,定义一个树节点的类 Node,包含节点名称、节点编号、父节点编号、节点类型等属性。然后,依次遍历后端返回的数据,对于每一条数据,查找其父节点是否已存在,如果存在则添加到父节点的子节点列表中,否则先创建父节点,然后将当前节点添加到父节点的子节点列表中。最终得到一个树形结构。

示例:

假设后端返回以下数据:

List<Map<String, Object>> data = [{id: 1, pid: 0, name: 'root', type: 1},{id: 2, pid: 1, name: 'node1', type: 2},{id: 3, pid: 1, name: 'node2', type: 2},{id: 4, pid: 2, name: 'node1-1', type: 3},{id: 5, pid: 2, name: 'node1-2', type: 3},{id: 6, pid: 3, name: 'node2-1', type: 3},
]

复制代码

这里我们可以看到数据中包含节点的编号、节点的父节点编号、节点的名称以及节点的类型等信息。

我们可以定义一个 Node 类来表示节点信息:

public class Node {private String id;private String parentId;private String name;private int type;private List<Node> children;// 构造函数,getter和setter方法
}

复制代码

接着,我们可以编写一个递归函数,将上述数据转换为树形结构,示例代码如下:

public Node buildTree(List<Map<String, Object>> data, String pid) {List<Node> nodeList = new ArrayList<>();// 第一次遍历,将所有节点存入nodeList中for (Map<String, Object> map : data) {Node node = new Node();node.setId(map.get("id").toString());node.setParentId(map.get("pid").toString());node.setName(map.get("name").toString());node.setType((int) map.get("type"));nodeList.add(node);}// 第二次遍历,将nodeList中的节点添加到对应的父节点的子节点列表中for (Node node : nodeList) {if (pid.equals(node.getParentId())) {children.add(node);} else {for (Node parent : nodeList) {if (node.getParentId().equals(parent.getId())) {parent.getChildren().add(node);break;}}}}// 第三次遍历,找出根节点并返回for (Node node : nodeList) {if (pid.equals(node.getId())) {return node;}}return null;
}

复制代码

2. 递归生成 JSON 树

得到了树形结构后,我们需要将其转换为 JSON 格式的数据,再返回给前端。

用递归的方式将树形结构转换成 JSON 格式的代码示例如下:

public JSONObject toJSON(Node node) {JSONObject jsonObject = new JSONObject();jsonObject.put("id", node.getId());jsonObject.put("name", node.getName());jsonObject.put("type", node.getType());if (node.getChildren() != null && node.getChildren().size() > 0) {JSONArray jsonArray = new JSONArray();for (Node child : node.getChildren()) {jsonArray.add(toJSON(child));}jsonObject.put("children", jsonArray);} else {jsonObject.put("children", null);}return jsonObject;
}

复制代码

3. 最后,将 JSON 数据返回给前端

最后,将生成的 JSON 树返回给前端即可。可以使用 Spring Boot 等后端框架中的 REST 接口返回 JSON 数据。

示例:假设前端需要获取一个编号为 1 的节点的 JSON 树,则后端代码可以如下实现:

@GetMapping("/tree")
public JSONObject tree() {List<Map<String, Object>> data = getDataFromDB();Node root = buildTree(data, "1");return toJSON(root);
}

复制代码

这个接口的作用是从数据库中获取数据,然后将数据转换为树形结构并返回 JSON 树,其中编号为 1 的节点作为根节点。

另外,需要在前端进行 AJAX 请求,获取后端生成的 JSON 树,并显示在页面上。

总结:

以上就是将后端的数据转换为树形结构,再通过递归生成 JSON 树,并返回给前端的完整攻略。需要注意的是,本文只提供了一个示例实现方法,在实际应用中,可能需要根据具体数据结构进行相应的修改。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/57383.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

nodejs项目从头创建

npm是包管理工具命令 参数init表示进行Node应用项目的初始化操作。 # -y 表示项目使用默认配置参数 npm init -y 装包 npm install electron --save-dev启动开发服务器 npm start 启动应用 运行在package.json中定义的脚本 npm run serve构建项目&#xff0c;通常用于生产…

CountDownLatch与CyclicBarrier的比较应用

CountDownLatch与CyclicBarrier的比较&应用 CountDownLatch 说明 一个线程等待其他线程执行完之后再执行&#xff0c;相当于加强版的join&#xff0c;在初始化CountDownLatch是需要设定计数器的数值&#xff08;计数器数据不一定跟线程数相同&#xff0c;但是一定计数器…

金蝶云星空与管易云的数据集成实战案例

金蝶云星空与管易云的数据集成案例分享 在企业信息化系统中&#xff0c;实现不同平台之间的数据无缝对接是提升业务效率的关键。本文将聚焦于一个具体的系统对接集成案例&#xff1a;如何将金蝶云星空中的调拨申请单数据集成到管易云的采购订单新增模块&#xff0c;特别是针对…

成本累计曲线:项目预算的秘密武器

在项目管理的过程中&#xff0c;成本控制是影响项目成败的关键因素之一&#xff0c;而其中“成本累计曲线”就像是一位财务导航员&#xff0c;为项目的成本控制和进度监控提供了极大的帮助。那么&#xff0c;什么是成本累计曲线&#xff1f;它包含哪些步骤&#xff1f;如何应用…

Python入门——iter迭代器—__iter__()方法__next__()方法

iter迭代器 在 Python 中&#xff0c;迭代器&#xff08;Iterator&#xff09;是一个可以记住遍历位置的对象。迭代器对象从集合的第一个元素开始访问&#xff0c;直到所有的元素被访问完毕后结束。迭代器只能往前走&#xff0c;不能回退。 迭代器的核心概念 迭代器协议: 任…

idea连接数据库出现错误的解决方式

在使用idea连接数据库时&#xff0c;出现错误&#xff1a; The server has terminated the handshake. The protocol list option (enabledTLSProtocols) is set, this option might cause connection issues with some versions of MySQL. Consider removing the protocol li…

C++朝花夕拾

目录 目录 函数分文件编写 野指针 const与指针 const修饰指针——常量指针 const修饰常量——指针常量 const既修饰指针,又修饰常量 const阻止函数修改 delete和delete[]的区别 内存四区&#xff08;面试会问&#xff1f;&#xff09; 程序运行前 代码区 全局区 程…

UEFI SHELL更新driver

一、U盘文件UEFI ISOreadme截图&#xff1a;http://172.31.1.20:8082/apt_ubuntu22.04/init-V22.04.sh 二、步骤&#xff1a; 1.KVM挂载uefi_shell_24H1.iso; 2.POWER CYCLE启动进UEFI SHELL&#xff1b; 3.运行以下命令&#xff08;提前解压U盘中更新的zip文件&#xff09;&…

WPF中如何解决DataGrid的Header没有多余的一行

将最后一行设置DataGridTemplateColumn Width"*" 使其自适应

网站制作公司哪家比较靠谱?分享5家2024年口碑好的网站制作公司

想要分辨一家网站制作公司靠不靠谱并不简单&#xff0c;可能它流程透明&#xff0c;设计优秀。但这就一定是适合自己的吗&#xff1f;所以口碑这东西很重要。适合自己也很重要&#xff0c;要多方面去了解。 以下是五家在2024年口碑不错的网站制作公司&#xff0c;分享一下设计…

R学习笔记-单因素重复测量方差分析

R语言之重复测量方差分析——ezANOVA的使用与解析 - 知乎 单因素重复测量方差分析(One-Way Repeated Measures ANOVA)——R软件实现 - 梦特医数通 ### 清空environment rm(list ls()) ### 加载包 if (!require("tidyverse")) install.packages("tidyverse&quo…

51单片机STC8G串口Uart配置

测试环境 单片机型号&#xff1a;STC8G1K08-38I-TSSOP20&#xff0c;其他型号请自行测试&#xff1b; IDE&#xff1a;KEIL C51&#xff1b; 寄存器配置及主要代码 STC8G系列单片机具有4个全双工异步串行通信接口&#xff1b;本文以串口1为例&#xff0c;串口1有4种工作方式…

document 的 TS 类型

在 TypeScript 中&#xff0c;document 的类型是 Document。 Document接口代表整个 HTML 或 XML 文档。它提供了访问和操作文档内容的方法和属性。 一、属性 1. document.title 获取或设置文档的标题。 console.log(document.title); 2. document.documentElement 返回文…

像素、分辨率、PPI(像素密度)、帧率的概念

文章目录 前言一、像素1、定义2、像素点也不是越多越好 二、分辨率1、定义 三、PPI(像素密度)1、定义2、计算公式3、视网膜屏幕 四、帧率1、帧 (Frame)2、帧数 (Frames)3、帧率 (Frame Rate)4、FPS (Frames Per Second)5、赫兹 五、其他1、英寸2、为何显示器尺寸以英寸命名 总结…

编程语言的设计模式

编程语言的设计模式是一种总结和抽象&#xff0c;帮助开发者应对常见的编程问题。以下是几种主要的设计模式&#xff1a; 1. 创建型模式 单例模式 (Singleton Pattern)&#xff1a;确保一个类只有一个实例&#xff0c;并提供一个全局访问点。工厂模式 (Factory Pattern)&…

Linux初阶——信号

一、预备 1、信号的处理方式 1.1. 默认动作 当收到一个信号时&#xff0c;就执行这个信号的默认动作。 1.2. 忽略 当收到一个信号时&#xff0c;就忽略执行这个信号的默认动作。 1.3. 自定义动作 当收到一个信号时&#xff0c;就执行信号的自定义动作。 2、硬件中断 你…

跨设备使用的便签软件哪款好?

在快节奏的现代生活中&#xff0c;便签软件已成为我们不可或缺的数字助手&#xff0c;它们帮助我们记录灵感、安排日程、设置提醒&#xff0c;极大地提升了我们的工作与生活效率。然而&#xff0c;面对市场上琳琅满目的便签应用&#xff0c;选择一款既实用又适合手机使用的便签…

【万兴科技-注册_登录安全分析报告】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞…

51单片机应用开发(进阶)---外部中断(按键+数码管显示0-F)

实现目标 1、巩固数码管、外部中断知识 2、具体实现&#xff1a;按键K4&#xff08;INT1&#xff09;每按一次&#xff0c;数码管从0依次递增显示至F&#xff0c;再按则循环显示。 一、共阳数码管 1.1 共阳数码管结构 1.2 共阳数码管码表 共阳不带小数点0-F段码为&#xff…

B计划在哪里?下一个10年我在哪里?

闲聊&#xff1a; 人生已走过32个年头&#xff0c;毕业之后赌了10年&#xff0c;而今在下一个10年的十字路口&#xff0c;要往哪个方向走&#xff1f;能否挺过35岁程序员的魔咒&#xff0c;即使挺过了35岁&#xff0c;又能怎么样呢&#xff1f;还是在拿着月不付出的工资&#x…