• 用java代码将从数据库中取出的具有父子关系的数据转成json格式


    思路:
    ①、取出数据中的所有父节点放入一个集合中
    ②、取出数据中所有为该父节点的子节点放入另一个集合中
    ③、用到迭代的方法将子节点一层一层的遍历
    工具类:
    package com.assasion.test;

    import net.sf.json.JSONArray;

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

    public class TreeBuilder {


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

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

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

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

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

    /**
    * 获取父节点下所有的子节点
    * @param pnode
    * @return
    */
    public List<CompanyNode> getChildNodes(CompanyNode pnode) {//传入父节点对象,如果为该父节点的子节点,则放入子节点集合中
    List<CompanyNode> childNodes = new ArrayList<CompanyNode>();
    for (CompanyNode n : nodes){//从nodes中筛选所以为pnode的子节点
    if (pnode.getCybh().equals(n.getSj_cybh())) {
    childNodes.add(n);
    }
    }
    return childNodes;
    }

    /**
    * 判断是否为根节点
    * @param node
    * @return
    */
    public boolean rootNode(CompanyNode node) {
    boolean isRootNode = true;
    for (CompanyNode n : nodes){//从nodes中筛选所以父节点
    if (node.getSj_cybh().equals(n.getCybh())) {//判断传入的node对象中,他的上级成员编号还有没有node中的成员编号与之对应,如果没有,则为根节点
    isRootNode= false;
    break;
    }
    }
    return isRootNode;
    }

    /**
    * 获取集合中所有的根节点
    * @return
    */
    public List<CompanyNode> getRootNodes() {
    List<CompanyNode> rootNodes = new ArrayList<CompanyNode>();
    for (CompanyNode n : nodes){
    if (rootNode(n)) {
    rootNodes.add(n);//把所以的根节点放入rootNodes集合中
    }
    }
    return rootNodes;
    }
    }
    实体类:
    package com.assasion.test;

    import java.util.List;

    public class CompanyNode {
    private String name ;//公司名称
    private String cybh;//成员编号
    private String sj_cybh;//上级成员编号
    private List<CompanyNode> child;//下级公司

    public CompanyNode() {
    }

    public CompanyNode(String name, String cybh, String sj_cybh,List<CompanyNode> child) {
    this.name = name;
    this.cybh = cybh;
    this.sj_cybh = sj_cybh;
    this.child=child;
    }

    public List<CompanyNode> getChild() {
    return child;
    }

    public void setChild(List<CompanyNode> child) {
    this.child = child;
    }

    public String getName() {
    return name;
    }

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

    public String getCybh() {
    return cybh;
    }

    public void setCybh(String cybh) {
    this.cybh = cybh;
    }

    public String getSj_cybh() {
    return sj_cybh;
    }

    public void setSj_cybh(String sj_cybh) {
    this.sj_cybh = sj_cybh;
    }
    }
  • 相关阅读:
    输入框正则表达式验证
    MySQL表名、列名区分大小写详解
    前后台交互
    分页写法
    web程序调试方法
    html 标签
    Aborting commit: 'XXXXXXXX'remains in conflict错误
    返回按钮
    跳出frameset框架
    fastadmin中关联表时A为主表,想让B表和C表关联时怎么办?
  • 原文地址:https://www.cnblogs.com/assasion/p/8035437.html
Copyright © 2020-2023  润新知