Java递归算法构造JSON树形结构

1.前言

最近项目中有一个需求,数据库中的菜单表是一个常见的id-pid结构,需要把它构建成树形的JSON格式发送给第三方,写出来之后感觉也是很简单的,核心代码只有5行,重要的是思路要明确,这里把源码分享给大家。

工程里面使用了json-lib.jar这个包,作用是将List序列化成JSON。

2.源码

package com.agileai.esb.smc.domain;

import java.util.*;

import net.sf.json.JSONArray;

public class TreeBuilder {

List<TreeBuilder.Node>nodes = newArrayList<TreeBuilder.Node>();

public TreeBuilder(List<Node> nodes) {

super();

this.nodes= nodes;

}

/**

* 构建JSON树形结构

* @return

*/

public String buildJSONTree() {

List<Node>nodeTree = buildTree();

JSONArrayjsonArray = JSONArray.fromObject(nodeTree);

return jsonArray.toString();

}

/**

* 构建树形结构

* @return

*/

public List<Node> buildTree() {

List<Node>treeNodes = newArrayList<Node>();

List<Node>rootNodes = getRootNodes();

for (Node rootNode : rootNodes) {

buildChildNodes(rootNode);

treeNodes.add(rootNode);

}

return treeNodes;

}

/**

* 递归子节点

* @param node

*/

public voidbuildChildNodes(Node node) {

List<Node> children = getChildNodes(node);

if (!children.isEmpty()) {

for(Node child : children) {

buildChildNodes(child);

}

node.setMenus(children);

}

}

/**

* 获取父节点下所有的子节点

* @param nodes

* @param pnode

* @return

*/

public List<Node> getChildNodes(Nodepnode) {

List<Node>childNodes = newArrayList<Node>();

for (Node n : nodes){

if (pnode.getId().equals(n.getPid())) {

childNodes.add(n);

}

}

return childNodes;

}

/**

* 判断是否为根节点

* @param nodes

* @param inNode

* @return

*/

public booleanrootNode(Node node) {

boolean isRootNode = true;

for (Node n : nodes){

if (node.getPid().equals(n.getId())) {

isRootNode= false;

break;

}

}

return isRootNode;

}

/**

* 获取集合中所有的根节点

* @param nodes

* @return

*/

public List<Node> getRootNodes() {

List<Node>rootNodes = newArrayList<Node>();

for (Node n : nodes){

if (rootNode(n)) {

rootNodes.add(n);

}

}

return rootNodes;

}

public staticclass Node {

private String id;

private String pid;

private String text;

private String url;

private List<Node> menus;

public Node() {}

public Node(String id, String pid, Stringtext, String url) {

super();

this.id =id;

this.pid =pid;

this.text =text;

this.url =url;

}

public String getId() {

return id;

}

public voidsetId(String id) {

this.id =id;

}

public String getPid() {

return pid;

}

public voidsetPid(String pid) {

this.pid =pid;

}

public String getText() {

return text;

}

public voidsetText(String text) {

this.text =text;

}

public String getUrl() {

return url;

}

public voidsetUrl(String url) {

this.url =url;

}

public List<Node> getMenus() {

return menus;

}

public voidsetMenus(List<Node> menus) {

this.menus= menus;

}

}

public staticvoid main(String[] args) {

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

Nodep1 = new Node("01", "","01", "");

Nodep6 = new Node("02", "","02", "");

Nodep7 = new Node("0201", "02","0201", "");

Nodep2 = new Node("0101", "01","0101", "");

Nodep3 = new Node("0102", "01","0102", "");

Nodep4 = new Node("010101", "0101","010101", "");

Nodep5 = new Node("010102", "0101","010102", "");

nodes.add(p1);

nodes.add(p2);

nodes.add(p3);

nodes.add(p4);

nodes.add(p5);

nodes.add(p6);

nodes.add(p7);

TreeBuildertreeBuilder = new TreeBuilder(nodes);

System.out.println(treeBuilder.buildJSONTree());

}

}

Java递归算法构造JSON树形结构文档   下载

时间: 2024-10-14 07:21:52

Java递归算法构造JSON树形结构的相关文章

递归算法解析成树形结构

/** * 递归算法解析成树形结构 * * @param cid * @return * @author jiqinlin */ public TreeNodeModel recursiveTree(int org_code) { //根据cid获取节点对象(SELECT * FROM tb_tree t WHERE t.cid=?) MiddleOrgEntity middleOrgEntity = new MiddleOrgEntity(); middleOrgEntity.setTable

解析java树形结构

思路一: 1.准备表结构及对应的表数据a.表结构: create table TB_TREE ( CID NUMBER not null, CNAME VARCHAR2(50), PID NUMBER //父节点 ) b.表数据: insert into tb_tree (CID, CNAME, PID) values (1, '中国', 0); insert into tb_tree (CID, CNAME, PID) values (2, '北京市', 1); insert into tb_

个人常用工具类:JAVA树形结构工具类01

JAVA树形结构工具类 BaseTreeObj.java /** * 基层树形结构实体类 * 必备属性:id,parentId,childsList */ @Data public class BaseTreeObj implements Serializable { private static final long serialVersionUID = 1L; private String id; private String parentId; private String name; p

easyUI树形结构

树形结构是常见也是常用的,之前一直在使用但是基本都是调用别人写好的方法,好像也没调用太明白的感觉,这次在开发ITOO的时候终于研究了一番,发现其实要实现树形结构其实不是一件困难的事,而且实现方法也不是唯一的,之前大家都很倾向使用zTree,网上搜了一下发现zTtree是一个比较强大"树插件"但是觉得对于目前的我来说并不是很合适,首先我们的前台框架使用的easyUI,easyUI有自己的树形结构控件,再引入一个zTree没有多大的必要:而且对于我来说相对于js代码来说我更熟悉使用后台ja

利用多叉树实现Ext JS中的无限级树形菜单(一种构建多级有序树形结构JSON的方法)

一.问题研究的背景和意义 目前在Web应用程序开发领域,Ext JS框架已经逐渐被广泛使用,它是富客户端开发中出类拔萃的框架之一.在Ext的UI控件中,树形控件无疑是最为常用的控件之一,它用来实现树形结构的菜单.TreeNode用来实现静态的树形菜单,AsyncTreeNode用来实现动态的异步加载树形菜单,后者最为常用,它通过接收服务器端返回来的JSON格式的数据,动态生成树形菜单节点.动态生成树有两种思路:一种是一次性生成全部树节点,另一种是逐级加载树节点(利用AJAX,每次点击节点时查询下

Java中构造和解析JSON

什么是 Json? JSON(JvaScript Object Notation)(官网网站:http://www.json.org/)是 一种轻量级的数据交换格式.  易于人阅读和编写.同时也易于机器解析和生成.它基于 JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999 的一个子集.  JSON 采用完全独立于语言的文本格式,但是也使用了类似于 C 语言家族的习惯(包括C, C++, C#

Java创建树形结构算法实例

在JavaWeb的相关开发中经常会涉及到多级菜单的展示,为了方便菜单的管理需要使用数据库进行支持,本例采用相关算法讲数据库中的条形记录进行相关组装和排序讲菜单组装成树形结构. 首先是需要的JavaBean 1 2 3 import java.io.Serializable; 4 import java.util.ArrayList; 5 import java.util.Collections; 6 import java.util.Comparator; 7 import java.util.

java 树形结构工具类

   好久就想写博客了,苦苦因为没时间...没关系.从现在开始,每天我都会努力抽出点时间来进行做一次总结.把我认为在项目需求中认为很有用的东西,展示给大家,希望大家一起学习,一起进步.第一次做总结,写的不好的,提出来一起学习,谢谢.    分析:   在业务需求总,我们总会碰到一些业务.比如:对上下级的用户关系进行遍历,对资源权限进行遍历...等等.这些业务非常常见.在同一个项目中,他的代码遍历都是类似的,为了更高效的复用代码,我们有必要进行深成次的封转.下面是我花了一点时间进行封装,有需要直接

java 把DataTable数据类型转换为树形结构(多叉树)

问题分析:一个关系数据库的表,如图所示: 可以看到后面四个字段:Country,Province,City,Street 具有逻辑上的从属结构,现在要把这种数据搞成一个树形结构,如图所示: 不是原来的数据转换而成的,大致就是这个意思,可以想象成,dataTable里面相同的数据进行单元格合并,然后找到所有的从根到叶子节点的路径,就算完成任务.JS里面似乎有很多插件可以实现,但Java中我暂时还没找到,没办法只能自己写了.从结构上看,应该是一个多叉多级树形结构,所以在转换的时候必须具备一定的灵活性