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

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

1.为什么要写这样的一篇博客?

2.java 后端代码

3. 转化完的数据在前端格式为类似于:

1.为什么要写这样的一篇博客?

在公司的实习的时候,遇到了一个略坑的东西,就是要医院的科室通过其子父id做成一颗项目树,但是科室的层次有很多,有点甚至到了六层,导致最终选择了优化后的递归算法。

如果在三层或者三层以下,可以考虑使用内部类,超过三层的话,最好就使用递归了,不过记得必须的优化。

2.java 后端代码

代码的解释和理解我卸载代码里面,返回到前端会自动转换成Json格式的数据。

//第一个参数,需要生成树的数组,第二个参数为树的根节点
public JSONObject getJsontree(JSONArray json,JSONObject job){
 JSONArray tempJson = JSONArray.fromObject("[]");
 //筛选出父id等于job里面id的科室
 for(int i = 0;i < json.size();i++)
 {
 //这里可以使用Iterator
 if(json.getJSONObject(i).get("parent_id").equals(job.get("unit_sn"))) {
  tempJson.add(json.getJSONObject(i));
 };
 }
 // 优化,减少科室集合的数量,避免重复查询,有再优化的方法,希望告知。。
 json.removeAll(tempJson);
 for(int i = 0;i < tempJson.size(); i ++) {
 //对第二层进行递归,此处类推
 getJsontree(json, tempJson.getJSONObject(i));
 }
 //生成完的树结构map集合加到根节点
 if(tempJson.size()!=0)
 job.put("children", tempJson);
 return job;
}

3. 转化完的数据在前端格式为类似于:

[
 { text: '节点1', children: [
  { text: '节点1.1' },
  { text: '节点1.2' },
  { text: '节点1.3', children: [
  { text: '节点1.3.1' },
  { text: '节点1.3.2' }
  ]
  },
  { text: '节点1.4' }
 ]
 }
 ]

补充知识:java将list转为树形结构的方法

1、通过转化成json封装数据

[
 {
 "name":"甘肃省",
 "pid":0,
 "id":1
 },
 {
 "name":"天水市",
 "pid":1,
 "id":2
 },
 {
 "name":"秦州区",
 "pid":2,
 "id":3
 },
 {
 "name":"北京市",
 "pid":0,
 "id":4
 },
 {
 "name":"昌平区",
 "pid":4,
 "id":5
 }
]

现需要是使用java将以上数据转为树形结构,转化后下的结构如下

[
 {
 "children":[
  {
  "children":[
   {
   "name":"秦州区",
   "pid":2,
   "id":3
   }
  ],
  "name":"天水市",
  "pid":1,
  "id":2
  }
 ],
 "name":"甘肃省",
 "pid":0,
 "id":1
 },
 {
 "children":[
  {
  "name":"昌平区",
  "pid":4,
  "id":5
  }
 ],
 "name":"北京市",
 "pid":0,
 "id":4
 }
]

代码如下

 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;

 public static JSONArray listToTree(JSONArray arr, String id, String pid, String child) {
 JSONArray r = new JSONArray();
 JSONObject hash = new JSONObject();
 //将数组转为Object的形式,key为数组中的id
 for (int i = 0; i < arr.size(); i++) {
  JSONObject json = (JSONObject) arr.get(i);
  hash.put(json.getString(id), json);
 }
 //遍历结果集
 for (int j = 0; j < arr.size(); j++) {
  //单条记录
  JSONObject aVal = (JSONObject) arr.get(j);
  //在hash中取出key为单条记录中pid的值
  String pidStr = "";
  Object pidObj = aVal.get(pid);
  if (aVal.get(pid) != null) {
  pidStr = aVal.get(pid).toString();
  }
  JSONObject hashVP = (JSONObject) hash.get(pidStr);
  //如果记录的pid存在,则说明它有父节点,将她添加到孩子节点的集合中
  if (hashVP != null) {
  //检查是否有child属性
  if (hashVP.get(child) != null) {
   JSONArray ch = (JSONArray) hashVP.get(child);
   ch.add(aVal);
   hashVP.put(child, ch);
  } else {
   JSONArray ch = new JSONArray();
   ch.add(aVal);
   hashVP.put(child, ch);
  }
  } else {
  r.add(aVal);
  }
 }
 return r;
 }
public static void main(String[] args){
 List<Map<String,Object>> data = new ArrayList<>();
 Map<String,Object> map = new HashMap<>();
 map.put("id",1);
 map.put("pid",0);
 map.put("name","甘肃省");
 data.add(map);
 Map<String,Object> map2 = new HashMap<>();
 map2.put("id",2);
 map2.put("pid",1);
 map2.put("name","天水市");
 data.add(map2);
 Map<String,Object> map3 = new HashMap<>();
 map3.put("id",3);
 map3.put("pid",2);
 map3.put("name","秦州区");
 data.add(map3);
 Map<String,Object> map4 = new HashMap<>();
 map4.put("id",4);
 map4.put("pid",0);
 map4.put("name","北京市");
 data.add(map4);
 Map<String,Object> map5 = new HashMap<>();
 map5.put("id",5);
 map5.put("pid",4);
 map5.put("name","昌平区");
 data.add(map5);
 System.out.println(JSON.toJSONString(data));
 JSONArray result =
 listToTree(JSONArray.parseArray(JSON.toJSONString(data)),"id","pid","children");
 System.out.println(JSON.toJSONString(result));
}

以上这篇java后端把数据转换为树,map递归生成json树,返回给前端(后台转换)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • java实现图片滑动验证(包含前端代码)

    前言 1.下面是一个效果展示: 2.先抱怨一下,在博客上面的抄袭真的非常严重,为了实现一个图片滑动验证,我搜索了挺久的资料,不过内容翻来覆去就是同样的内容,千篇一律,作者还各不相同:内容相同我就不多说了,毕竟能解决问题就行,然而恰恰相反,这些东西都没有为我实质性地解决问题.可能图片验证是一个需要前后台同时交互的功能吧,从业的人员大部分都是偏向后台或者偏向前台的,所以写出来的博客都不能完整阐述整个流程,下面是我自己实践完成的内容,记录一下,供各位参阅斧正. 注:由于使用到的控件和工具较多,有许多地

  • java封装前端查询条件通用版

    本文实例为大家分享了java封装前端查询条件的具体代码,供大家参考,具体内容如下 import hengyi.oa.mobile.exception.ServiceException; import java.io.UnsupportedEncodingException; import java.util.List; import java.util.Map; import java.util.Map.Entry; import javax.servlet.http.HttpServletRe

  • java实现后台数据显示在前端

    本篇使用servlet +.ajax( )的技术,实现简单的前后台的交互问题. 首先来了解一下AJAX AJAX是jquery的一个方法,一种在网页上调用后台接口的方式. 示例:$.ajax( { 参数 } ) ; $.ajax()等同于jQuery.ajax( ) 参数里是一个JS对象, 其中的属性: type: ' GET' /'POST' url: 接口地址 success:服务器应答时,调用此function处理(回调方法) 另外说一下Servlet Servlet,服务小程序,为客户端

  • Java 通过 二三法 巧解前端数据显示

    目录 一.前言 二.正文部分 Model法: Map法: 一.前言 上回我们说过了数据在后端的接受的三种方法,那么今天自然就来了解以及学会数据 在前端的显示,前端显示也是十分重要的,这在购物之类的平台,显示我们所购之物 的原理就是前端显示. 二.正文部分 许多人看到这标题或许有什么是"二三法",不要着急,慢慢看,答案就会自在心中了. Model法: 打开我们前面写过的文章,在Demo类下,如图,这是我后端数据接受的第一种方法, 前端数据接受只需要在第二个public String括号里

  • JAVA后台转换成树结构数据返回给前端的实现方法

    我们会经常用到树形,那么树形结构的数据是在前端做还是在后台做呢?我自己用过前端的ztree,selectTree等这些属于前端的组件,后台只需要把一个表的所有数据返回给前段就可以,前端可以通过id,pid来把层级结构划分,要是我们前端需要后台直接返回树结构数据怎么办,那么接下来我给大家介绍一下我写过的例子. 我们先看一张图了解一下树结构:我这里随便找一张图了解一下即可 接下来我们看一下数据,主要包括id,pid,名称 接下来我们写一个小例子,用递归方式转换为数 实体: package cn.cc

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

    java 后端,把数据转换为树,map递归生成一颗json树,返回给前端(后台转换) 1.为什么要写这样的一篇博客? 2.java 后端代码 3. 转化完的数据在前端格式为类似于: 1.为什么要写这样的一篇博客? 在公司的实习的时候,遇到了一个略坑的东西,就是要医院的科室通过其子父id做成一颗项目树,但是科室的层次有很多,有点甚至到了六层,导致最终选择了优化后的递归算法. 如果在三层或者三层以下,可以考虑使用内部类,超过三层的话,最好就使用递归了,不过记得必须的优化. 2.java 后端代码 代

  • Vue中传递自定义参数到后端、后端获取数据并使用Map接收参数

    目录 1.未进行二次封装之前的操作 1.1 前端调用接口设计 1.2 后端接口设计 2.使用二次封装axios后的设计 2.1 封装的接口类型(只展示关键的接口调用部分) 2.2 前端调用接口设计 2.3 后端接口设计 3.友情提示 4.效果展示 在对axios进行二次封装的时候.为了统一接口的设计.有些传递的参数是直接拼接到URL地址栏中的.但是为了统一管理.不能将传递的参数直接拼接到地址栏中.如何自定义传递的参数到后端,后端如何获取到这些自定义的参数?如果解决这一问题,我就能随便传递参数,不

  • PHP使用递归生成文章树

    因为自己的一个技术站,以文章为主,文章有些是一个系列的,所以想把这些文章归类,同一类的在一个下面. 数据库好设计,无非用id,fatherid来进行归类,fatherid代表父类是那篇文章的id,id是文章的唯一id,层次不限,可以是两层,可以是三层.fatherid为0的表示顶层文章. php代码,主要是递归 function category_tree($fatherid){ //require_once("mysql_class/config.inc.php"); //requi

  • 利用python将json数据转换为csv格式的方法

    假设.json文件中存储的数据为: {"type": "Point", "link": "http://www.dianping.com/newhotel/22416995", "coordinates": [116.37256372996957, 40.39798447055443], "category": "经济型", "name": &qu

  • 易语言将其它类型的数据转换为双精度小数型

    到数值命令 英文命令:val 操作系统支持:Windows.Linux    所属类别:数值转换 返回包含于文本内的数值,文本中是一个适当类型的数值,支持全角书写方式.本命令也可用作将其他类型的数据转换为双精度小数. 语法:  双精度小数型  到数值 (待转换的文本或数值) 例程 说明 编辑框中的内容为文本型,如果需要计算编辑框中的内容或者把其它非数值型数据放入到数值型数据中,就需要用到数值命令把这些数据转换到数值型. 运行结果: 总结 以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或

  • 详解JAVA后端实现统一扫码支付:微信篇

    最近做完了一个项目,正好没事做,产品经理就给我安排了一个任务. 做一个像收钱吧这样可以统一扫码收钱的功能. 一开始并不知道是怎么实现的,咨询了好几个朋友,才知道大概的业务流程:先是开一个网页用来判断支付平台,是微信还是支付宝,判断过后就好办了,直接照搬微信支付和支付宝的官方文档.不过微信的文档感觉有点坑,得多花点心思. 现在讲讲怎么实现微信支付网页支付,也就是公众号支付: 1.判断支付平台,在判断是微信平台时,必须使用window.location打开网页,使用其他方法在IOS版微信无法打开网页

  • 利用Vue2.x开发实现JSON树的方法

    前言 最近工作中遇到一个需求,由于项目需要一个解析 JSON 字符串并生成 JSON 树的功能,在 GitHub 上也没有找到合适的组件,因此基于 Vue2.X 自己写了一个 JSON 树组件,主要原理是利用 Vue 的递归组件,进行深度优先的先序遍历.该组件不仅可以将一段不可读的 JSON 字符串转化为可读的树形结构,同时可用于抓取某一子树的数据. Github源码 Github-Page 组件在它的模板内可以递归地调用自己.不过,只有当它有 name 选项时才可以这么做 字符串数据美化功能:

  • CI框架实现递归生成文件路径并重新生成图片功能

    本文实例讲述了CI框架实现递归生成文件路径并重新生成图片功能.分享给大家供大家参考,具体如下: <?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); set_time_limit(0); class Img_build extends CI_Controller{ private static $img_path = 'upload_old/'; private static $new_path =

  • java利用递归实现类别树示例代码

    在浏览淘宝,京东等各大商场的时候会发现首页一般都是商品分类,并且这个商品分类都是层级关系.下图以天猫商场为例,分为了三层的树状结构!!! 那么这种的类别树是怎么实现的呢?话不多说直接上代码: 1.首先我们新建一张商品类别表并维护所需数据: 2.创建商品类别实体 @Data @EqualsAndHashCode(callSuper = false) @Accessors(chain = true) @ApiModel("商品类别表") public class OrdersCategor

  • 在Java 8中将List转换为Map对象方法

    假设有一个员工对象: <b>public</b> <b>class</b> Employee { <font><i>// member variables</i></font><font> <b>private</b> <b>int</b> empId; <b>private</b> String empName; <b&

随机推荐