前言:在做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 Dire版权声明:原创文章,转载劳烦注明出处,谢谢。	https://blog.csdn.net/qq12547345/article/details/72765889ctory";Query query = factory.getCurrentSession().createQuery(hql).setResultTransformer(Transformers.aliasToBean(TreeBuilder.Node.class));return query.list();1

转载自。 https://blog.csdn.net/qq12547345/article/details/72765889