全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

利用java+mysql递归实现拼接树形JSON列表的方法示例

前言

本文给大家介绍的是关于利用java+mysql递归实现拼接树形JSON列表的相关内容,分享出来供大家参考学习,话不多说,来一起看看详细的介绍:

我们在做Java web项目时,前端控件例如国家-省-市-区-县等树形列表,常常需要多级树形json数据

例如:

[
 {
 "name": "商品目录",
 "pid": "-1",
 "id": "1",
 "children": [
  {
  "name": "日用品",
  "pid": "1",
  "id": "11",
  "children": [
   {
   "name": "洗发水",
   "pid": "11",
   "id": "111",
   "children": [
    {
     "name": "霸王",
     "pid": "111",
     "id": "1111",
     "children": []
    }
   ]
   }
  ]
  },
  {
  "name": "食品",
  "pid": "1",
  "id": "12",
  "children": []
  }
 ]
 }
]

整体思路分为两步,第一步获取目录及其所有子目录,获取后的列表形式如下:

[
 {"id":"1","pid":"-1","name":"商品目录"},
 {"id":"11","pid":"1","name":"日用品"},
 {"id":"12","pid":"1","name":"食品"},
 {"id":"111","pid":"11","name":"洗发水"},
 {"id":"1111","pid":"111","name":"霸王"}
]

第二步,利用递归思想拼装该数据,拼装方法的工具类如下:

package *.*.*;

import net.sf.json.JSONArray;

import java.util.ArrayList;
import java.util.List;

/**
 * 构造目录JSON树
 * Created by fukang on 2017/5/26 0026.
 */
public class TreeBuilder {

 List<Node> nodes = new ArrayList<>();

 public String buildTree(List<Node> nodes) {

  TreeBuilder treeBuilder = new TreeBuilder(nodes);

  return treeBuilder.buildJSONTree();
 }

 public TreeBuilder() {
 }

 public TreeBuilder(List<Node> nodes) {
  super();
  this.nodes = nodes;
 }

 // 构建JSON树形结构
 public String buildJSONTree() {
  List<Node> nodeTree = buildTree();
  JSONArray jsonArray = JSONArray.fromObject(nodeTree);
  return jsonArray.toString();
 }

 // 构建树形结构
 public List<Node> buildTree() {
  List<Node> treeNodes = new ArrayList<>();
  List<Node> rootNodes = getRootNodes();
  for (Node rootNode : rootNodes) {
   buildChildNodes(rootNode);
   treeNodes.add(rootNode);
  }
  return treeNodes;
 }

 // 递归子节点
 public void buildChildNodes(Node node) {
  List<Node> children = getChildNodes(node);
  if (!children.isEmpty()) {
   for (Node child : children) {
    buildChildNodes(child);
   }
   node.setChildren(children);
  }
 }

 // 获取父节点下所有的子节点
 public List<Node> getChildNodes(Node pnode) {
  List<Node> childNodes = new ArrayList<>();
  for (Node n : nodes) {
   if (pnode.getId().equals(n.getPid())) {
    childNodes.add(n);
   }
  }
  return childNodes;
 }

 // 判断是否为根节点
 public boolean rootNode(Node node) {
  boolean isRootNode = true;
  for (Node n : nodes) {
   if (node.getPid().equals(n.getId())) {
    isRootNode = false;
    break;
   }
  }
  return isRootNode;
 }

 // 获取集合中所有的根节点
 public List<Node> getRootNodes() {
  List<Node> rootNodes = new ArrayList<>();
  for (Node n : nodes) {
   if (rootNode(n)) {
    rootNodes.add(n);
   }
  }
  return rootNodes;
 }

 public static class Node {

  private String id;
  private String pid;
  private String name;
  private List<Node> children;

  public Node() {
  }

  public Node(String id, String pid, String name) {
   super();
   this.id = id;
   this.pid = pid;
   this.name = name;
  }

  public String getId() {
   return id;
  }

  public void setId(String id) {
   this.id = id;
  }

  public String getPid() {
   return pid;
  }

  public void setPid(String pid) {
   this.pid = pid;
  }

  public String getName() {
   return name;
  }

  public void setName(String name) {
   this.name = name;
  }


  public List<Node> getChildren() {
   return children;
  }

  public void setChildren(List<Node> children) {
   this.children = children;
  }
 }
}

在Controller中的调用方法是:

 @RequestMapping("/bulidJsonTree")
 @ResponseBody
 public String buildJsonTree(HttpServletRequest request) {

  // 获取全部目录节点
  List<Node> nodes = iGoodsDirSvc.getAllDirList();

  // 拼装树形json字符串
  String json = new TreeBuilder().buildTree(nodes);

  return json;
 }

其中iGoodsDirSvc.getAllDirList()方法需要将取到的数据转为Node类型:

String hql = "select id as id,pId as pid,name as name from Directory";

Query query = factory.getCurrentSession().createQuery(hql)
.setResultTransformer(Transformers.aliasToBean(TreeBuilder.Node.class));

return query.list();

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对的支持。


# java  # 递归解析json  # mysql  # 递归树形结构  # json  # 递归  # Java递归遍历树形结构的实现代码  # java后端把数据转换为树  # map递归生成json树  # 返回给前端(后台转换)  # java无限递归遍历json对象问题  # 的是  # 商品目录  # 相关内容  # 给大家  # 这篇文章  # 谢谢大家  # 多说  # 两步  # 第二步  # 判断是否  # 有疑问  # fukang  # Created  # util  # ArrayList  # List  # sf  # JSONArray  # return 


相关文章: 如何设计高效校园网站?  小米网站链接制作教程,请问miui新增网页链接调用服务有什么用啊?  如何处理“XML格式不正确”错误 常见XML well-formed问题解决方法  如何在IIS中新建站点并配置端口与物理路径?  SAX解析器是什么,它与DOM在处理大型XML文件时有何不同?  平台云上自助建站如何快速打造专业网站?  如何在Ubuntu系统下快速搭建WordPress个人网站?  如何快速搭建二级域名独立网站?  学校免费自助建站系统:智能生成+拖拽设计+多端适配  建站中国官网:模板定制+SEO优化+建站流程一站式指南  建站主机是什么?如何选择适合的建站主机?  官网自助建站系统:SEO优化+多语言支持,快速搭建专业网站  全景视频制作网站有哪些,全景图怎么做成网页?  定制建站流程解析:需求评估与SEO优化功能开发指南  在线教育网站制作平台,山西立德教育官网?  大学网站设计制作软件有哪些,如何将网站制作成自己app?  C++如何编写函数模板?(泛型编程入门)  企业网站制作费用多少,企业网站空间一般需要多大,费用是多少?  手机网站制作平台,手机靓号代理商怎么制作属于自己的手机靓号网站?  再谈Python中的字符串与字符编码(推荐)  如何在阿里云完成域名注册与建站?  天津个人网站制作公司,天津网约车驾驶员从业资格证官网?  浙江网站制作公司有哪些,浙江栢塑信息技术有限公司定制网站做的怎么样?  如何用低价快速搭建高质量网站?  Python如何创建带属性的XML节点  网站图片在线制作软件,怎么在图片上做链接?  公司网站建设制作费用,想建设一个属于自己的企业网站,该如何去做?  如何获取开源自助建站系统免费下载链接?  制作网站怎么制作,*游戏网站怎么搭建?  如何用狗爹虚拟主机快速搭建网站?  微网站制作教程,我微信里的网站怎么才能复制到浏览器里?  如何做网站制作流程,*游戏网站怎么搭建?  ,石家庄四十八中学官网?  广州营销型建站服务商推荐:技术优势与SEO优化解析  官网建站费用明细查询_企业建站套餐价格及收费标准指南  专业网站制作企业网站,如何制作一个企业网站,建设网站的基本步骤有哪些?  网站制作费用多少钱,一个网站的运营,需要哪些费用?  高端建站三要素:定制模板、企业官网与响应式设计优化  如何选择适合PHP云建站的开源框架?  制作旅游网站html,怎样注册旅游网站?  常州自助建站:操作简便模板丰富,企业个人快速搭建网站  建站之星如何优化SEO以实现高效排名?  建站之星图片链接生成指南:自助建站与智能设计教程  ,网页ppt怎么弄成自己的ppt?  如何在Golang中指定模块版本_使用go.mod控制版本号  深圳防火门网站制作公司,深圳中天明防火门怎么编码?  文字头像制作网站推荐软件,醒图能自动配文字吗?  家具网站制作软件,家具厂怎么跑业务?  如何快速搭建FTP站点实现文件共享?  宝塔面板创建网站无法访问?如何快速排查修复? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。