如何用Java拼接JSON方式遍历整个树形节点

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何用Java拼接JSON方式遍历整个树形节点相关的知识,希望对你有一定的参考价值。

数据库表结构
我是用Java查询此表所有数据。
在用Java来For来拼接,但存大很大问题。无法遍历完,请大神给点思路和代码提示。
拼接JSOn的格式为:
\"text\":\""+lists.get(i).getName()+"\",\"children\":[
chidren为子节点

//是类似这种吗
//控制层使用JSONArray jsonObject=JSONArray.fromObject();转换
Map<String,Object> map = new HashMap<String, Object>();

     map.put("id","1");

     map.put("text","实验外国语学校");

     List<Map<String,Object>> fatherList=new ArrayList<Map<String,Object>>();

     List<Map<String,Object>> list=new ArrayList<Map<String,Object>>();

     for(Bean bean:list)

         if("1".equals(list.getParent_level()))
    
         Map<String,Object> map2=new HashMap<String, Object>();
    
         map2.put("id",list.getId());
    
         map2.put("text",list.getName());
    
         list.add(map2);
    
         
    
     
     map.put("children",list);

追问

看样子,是我没有表达清楚呀,我的意思是说拼接JSON是没有问题的,问题是我无法遍历所有树的子节点拼接起来。
大概就是我能拼接到主节点和主节点下面的子节点。就是这个子节点下面如果还有节点我就没有办法整了了,我不知道如何遍历

参考技术A 网上有直接把java对象转json的工具。追问

看样子,是我没有表达清楚呀,我的意思是说拼接JSON是没有问题的,问题是我无法遍历所有树的子节点拼接起来。
大概就是我能拼接到主节点和主节点下面的子节点。就是这个子节点下面如果还有节点我就没有办法整了了,我不知道如何遍历

追答

可能是你遍历的javascript代码有问题,注意数组[]和json对象的遍历方式。

参考技术B JSONArray jsonArray = JSONArray.fromObject(lists);
String strJson = jsonArray.toString();

既然你知道自己的问题所在,就可以百度“怎样把list变成json字符串”,这样一搜不就有答案了么,在这里问不是浪费时间么追问

看样子,是我没有表达清楚呀,我的意思是说拼接JSON是没有问题的,问题是我无法遍历所有树的子节点拼接起来。
大概就是我能拼接到主节点和主节点下面的子节点。就是这个子节点下面如果还有节点我就没有办法整了了,我不知道如何遍历

追答

你表述太NB!!什么是“问题是我无法遍历所有树的子节点拼接起来”,你又要遍历,又要拼接;你到底是从json字符串遍历成对象出了问题,还是从对象拼接成json字符串出了问题;json有自己的方法,可以把list变成json,也可以把json变成list,并且像你这样类似父目录,子目录的,我也做过,也是用的json自己的方法做的,自己百度下吧

追问

年轻人要有耐心,我的意思是我这边可以正常拼接JSON格式字符串,但是在循环的时候,没有好的办法,循环匹配树形结构。如果有多层子节点的,我无法循环来完成。我是想请教有没有好的思路和方法可以循环多层


这里我循环出来,但教务教科处下面还有子节点,我就是循环教务教科处这个节点找不到办法。这下明白我的意思没有

本回答被提问者和网友采纳
参考技术C 可以用递归遍历树。

如何用Java实现树形结构啊?

请教各位大虾,如何用Java语言实现树形结构啊?类似:
一级菜单01
二级菜单0101
二级菜单0102
...
一级菜单02
二级菜单0201
二级菜单0202
...

最好能看到源代码,万分感谢!

package tree;

import java.util.LinkedList;
import java.util.List;

/**
* 功能:把一个数组的值存入二叉树中,然后进行3种方式的遍历
*
* 参考资料0:数据结构(C语言版)严蔚敏
*
* 参考资料1:http://zhidao.baidu.com/question/81938912.html
*
* 参考资料2:http://cslibrary.stanford.edu/110/BinaryTrees.html#java
*
* @author ocaicai@yeah.net @date: 2011-5-17
*
*/
public class BinTreeTraverse2

private int[] array = 1, 2, 3, 4, 5, 6, 7, 8, 9 ;
private static List<Node> nodeList = null;

/**
* 内部类:节点
*
* @author ocaicai@yeah.net @date: 2011-5-17
*
*/
private static class Node
Node leftChild;
Node rightChild;
int data;

Node(int newData)
leftChild = null;
rightChild = null;
data = newData;



public void createBinTree()
nodeList = new LinkedList<Node>();
// 将一个数组的值依次转换为Node节点
for (int nodeIndex = 0; nodeIndex < array.length; nodeIndex++)
nodeList.add(new Node(array[nodeIndex]));

// 对前lastParentIndex-1个父节点按照父节点与孩子节点的数字关系建立二叉树
for (int parentIndex = 0; parentIndex < array.length / 2 - 1; parentIndex++)
// 左孩子
nodeList.get(parentIndex).leftChild = nodeList
.get(parentIndex * 2 + 1);
// 右孩子
nodeList.get(parentIndex).rightChild = nodeList
.get(parentIndex * 2 + 2);

// 最后一个父节点:因为最后一个父节点可能没有右孩子,所以单独拿出来处理
int lastParentIndex = array.length / 2 - 1;
// 左孩子
nodeList.get(lastParentIndex).leftChild = nodeList
.get(lastParentIndex * 2 + 1);
// 右孩子,如果数组的长度为奇数才建立右孩子
if (array.length % 2 == 1)
nodeList.get(lastParentIndex).rightChild = nodeList
.get(lastParentIndex * 2 + 2);



/**
* 先序遍历
*
* 这三种不同的遍历结构都是一样的,只是先后顺序不一样而已
*
* @param node
* 遍历的节点
*/
public static void preOrderTraverse(Node node)
if (node == null)
return;
System.out.print(node.data + " ");
preOrderTraverse(node.leftChild);
preOrderTraverse(node.rightChild);


/**
* 中序遍历
*
* 这三种不同的遍历结构都是一样的,只是先后顺序不一样而已
*
* @param node
* 遍历的节点
*/
public static void inOrderTraverse(Node node)
if (node == null)
return;
inOrderTraverse(node.leftChild);
System.out.print(node.data + " ");
inOrderTraverse(node.rightChild);


/**
* 后序遍历
*
* 这三种不同的遍历结构都是一样的,只是先后顺序不一样而已
*
* @param node
* 遍历的节点
*/
public static void postOrderTraverse(Node node)
if (node == null)
return;
postOrderTraverse(node.leftChild);
postOrderTraverse(node.rightChild);
System.out.print(node.data + " ");


public static void main(String[] args)
BinTreeTraverse2 binTree = new BinTreeTraverse2();
binTree.createBinTree();
// nodeList中第0个索引处的值即为根节点
Node root = nodeList.get(0);

System.out.println("先序遍历:");
preOrderTraverse(root);
System.out.println();

System.out.println("中序遍历:");
inOrderTraverse(root);
System.out.println();

System.out.println("后序遍历:");
postOrderTraverse(root);


参考技术A 定义一个简单的菜单类 这里是简单的示例 你可以自行扩展package entity;import java.util.ArrayList;
import java.util.List;/**
* 菜单类
* @author Administrator
*
*/
public class Menu
/**
* 菜单标题
*/
private String title;
/**
* 子菜单的集合
*/
private List<Menu> childs;

/**
* 父菜单
*/
private Menu parent;

/**
* 构造函数 初始化标题和子菜单集合
*/
public Menu(String title)
this();
this.title=title;

/**
* 构造函数 创建一个虚拟的父菜单(零级菜单) 所有的一级菜单都归属于一个虚拟的零级菜单
*
*/
public Menu()
this.childs = new ArrayList<Menu>();

/**
* 获取子菜单
* @return
*/
public List<Menu> getChilds()
return childs;

/**
* 获取标题
* @return
*/
public String getTitle()
return title;

/**
* 获取父菜单
* @return
*/
public Menu getParent()
return parent;

/**
* 添加子菜单并返回该子菜单对象
* @param child
* @return
*/
public Menu addChild(Menu child)
this.childs.add(child);
return child;

/**
* 设置父菜单
* @param parent
*/
public void setParent(Menu parent)
this.parent = parent;

/**
* 设置标题
* @param title
*/
public void setTitle(String title)
this.title = title;

测试package entity;
/**
* 测试类
* @author Administrator
*
*/
public class Test /**
* @param args
*/
public static void main(String[] args)
/**
* 创建一个虚拟的父菜单 用于存放一级菜单 menu01 和 menu02
*/
Menu root = new Menu();
/**
* 创建两个一级菜单
*/
Menu menu01 = new Menu("一级菜单01");
Menu menu02 = new Menu("一级菜单02");
/**
* 加入虚拟菜单
*/
root.addChild(menu01);
root.addChild(menu02);
/**
* 为两个一级菜单分别添加两个子菜单 并返回该子菜单 需要进一步处理的时候 才接收返回的对象 否则只要调用方法
*/
Menu menu0101 = menu01.addChild(new Menu("二级菜单0101"));
menu01.addChild(new Menu("二级菜单0102"));
menu02.addChild(new Menu("二级菜单0201"));
Menu menu0202 = menu02.addChild(new Menu("二级菜单0202"));
/**
* 添加三级菜单
*/
menu0101.addChild(new Menu("三级菜单010101"));
menu0202.addChild(new Menu("三级菜单020201"));
/**
* 打印树形结构
*/
showMenu(root);
/**
* 递归遍历某个菜单下的菜单树
*
* @param menu
* 根菜单
*/
private static void showMenu(Menu menu)
for (Menu child : menu.getChilds())
showMenu(child, 0);

private static void showMenu(Menu menu, int tabNum)
for (int i = 0; i < tabNum; i++)
System.out.print("\t");
System.out.println(menu.getTitle());
for (Menu child : menu.getChilds())
// 递归调用
showMenu(child, tabNum + 1);

控制台输出结果 一级菜单01 二级菜单0101
三级菜单010101
二级菜单0102一级菜单02
二级菜单0201
二级菜单0202
三级菜单020201
参考技术B 楼主是不是在学Java se的,如果是的话,我记得在awt还是Swing中有一章是专门介绍树的好像Java类库中有专门的一个Tree类是完成这种功能的。
简单树
public static void main (String [] args)
Display display = new Display ();
Shell shell = new Shell (display);
shell.setLayout(new FillLayout());

final Tree tree = new Tree (shell, SWT.BORDER);

for (int i=0; i<4; i++)
TreeItem iItem = new TreeItem (tree, 0);
iItem.setText ("TreeItem (0) -" + i);
for (int j=0; j<4; j++)
TreeItem jItem = new TreeItem (iItem, 0);
jItem.setText ("TreeItem (1) -" + j);
for (int k=0; k<4; k++)
TreeItem kItem = new TreeItem (jItem, 0);
kItem.setText ("TreeItem (2) -" + k);
for (int l=0; l<4; l++)
TreeItem lItem = new TreeItem (kItem, 0);
lItem.setText ("TreeItem (3) -" + l);




shell.setSize (200, 200);
shell.open ();
while (!shell.isDisposed())
if (!display.readAndDispatch ()) display.sleep ();

display.dispose ();

楼主参考一下吧!
参考技术C /**
* 树形结构 ext 脚本递归算法
* */
private String builderPrivileges(String index, List<PrivilegesEntity> list,
HttpServletRequest request)
StringBuffer role = new StringBuffer();
role.append("[ ");
int listSize = list.size();
boolean bs = false;
for (int i = 0; i < listSize; i++)
PrivilegesEntity xtgl_cxdy = list.get(i);
//
if (xtgl_cxdy.getPARENTID().equals(index))
role.append(" ");
bs = true;
role.append("id:\'").append(xtgl_cxdy.getCXID()).append("\',")
.append("text:\'").append(xtgl_cxdy.getNAME());
role.append("\'").append(",leaf:true,href:\'").append(
request.getContextPath());
role.append("/").append(
"menupage.action?menu.MENUID=" + xtgl_cxdy.getCXID())
.append("\',hrefTarget:\'main\'");
if (xtgl_cxdy.getISLEAF().equals("0"))
role.append(",leaf:false,children:");
role.append(builderPrivileges(xtgl_cxdy.getCXID(), list,
request));

role.append("").append(",");


if (!bs)
return "[]";

return role.substring(0, role.length() - 1) + " ] ";

参考技术D 美工做的,html就行代码

以上是关于如何用Java拼接JSON方式遍历整个树形节点的主要内容,如果未能解决你的问题,请参考以下文章

如何用java递归生成带children的json串

如何用java递归生成带children的json串啊?数据集已经有了在下面。

如何用Java实现树形结构啊?

sql server怎么对树形结构表的节点进行拼接

如何用word画一幅二叉树图啊?

如何用java获取百度API返回的json数据的?