treegrid需要的json数据格式如下:
{ "rows":[ { "children":[ { "children":[ { "children":[], "custId":1001, "date":1464330407583, "id":1, "name":"C++", "nodeKey":"1[341c5e931385c3ad]", "nodeName":"C++", "sitId":100101, "size":30 }, { "children":[], "custId":1001, "date":1464330407583, "id":2, "name":"xxx", "nodeKey":"2[c28dfaface6bd00c]", "nodeName":"xxx", "sitId":100101, "size":600 }, { "children":[], "custId":1001, "date":1464330407583, "id":100101, "name":"yyy", "nodeKey":"100101[c16c4b41252de029]", "nodeName":"yyy", "sitId":100101, "size":600 }, { "children":[], "custId":1001, "date":1464330407583, "id":2, "name":"java", "nodeKey":"2[158fb4cd8cf3472b]", "nodeName":"java", "sitId":100101, "size":60 } ], "nodeKey":100101, "nodeName":"C++" }, { "children":[{ "children":[], "custId":1001, "date":1464330407583, "id":3, "name":"ruby", "nodeKey":"3[4c8a44b47c0cc58e]", "nodeName":"ruby", "sitId":100102, "size":10 }], "nodeKey":100102, "nodeName":"ruby" } ], "nodeKey":1001, "nodeName":"C++" }, { "children":[{ "children":[{ "children":[], "custId":1002, "date":1464330407583, "id":4, "name":"php", "nodeKey":"4[23105c3220673f3f]", "nodeName":"php", "sitId":100201, "size":15 }], "nodeKey":100201, "nodeName":"php" }], "nodeKey":1002, "nodeName":"php" } ], "total":0 }一般的数据源是从数据库查询出来的List<DataClass>格式;这种数据分两种
1、数据中含有ID、PARENT_ID的字段,通过这两个字断建立树;
2、利用数据中的几个字段建立树,如客户ID、门店ID、门店座机电话号码,建立三级树;
需要编写一段通用代码实现这个转换,以第二种为例,建树代码
public TreeGridNode<T> addNode(TreeGridNode<T> node, T newNode, int level, String[] parents, String[] names) { if (level == parents.length) { return node; } TreeGridNode<T> temp = null; String field = parents[level]; Object value = getFieldValue(newNode, field); TreeGridNode.NodeKey curKey = new TreeGridNode.NodeKey(field, value); String nameField = names[level]; Object nameValue = getFieldValue(newNode, nameField); TreeGridNode.NodeKey curName = new TreeGridNode.NodeKey(nameField, nameValue); for (int i = 0; i < node.getChildren().size(); i++) { TreeGridNode<T> curNode = node.getChildren().get(i); if (curNode.getKey().equals(curKey)) { temp = curNode; break; } } if (null == temp && level < parents.length - 1) { /** * 创建中间节点 */ temp = new TreeGridNode(newNode, curKey, curName); node.getChildren().add(temp); } else if (level >= parents.length - 1) { /** * 创建叶子节点 */ String tmpValue = String.valueOf(value) + "[" + randomSn() + "]"; curKey.setValue(tmpValue); temp = new TreeGridNode(newNode, curKey, curName); node.getChildren().add(temp); return node; } temp = addNode(temp, newNode, level + 1, parents, names); return temp; }
转换json代码
public String toTreeGridJsonString() { Map<String, Object> map = new HashMap<>(); map.put("total",getTotal()); treeToMap(getRoot(), map); return JSON.toJSONString(map, true); } private void treeToMap(TreeGridNode<T> node, Map<String, Object> map) { if (null != node) { if(!map.containsKey("total")) { if (node.getKey() != null) { map.put("nodeKey", node.getKey().getValue()); } if (node.getName() != null) { map.put("nodeName", node.getName().getValue()); } if (node.getChildren().size() == 0) { Field[] fs = node.getData().getClass().getDeclaredFields(); for (Field f : fs) { f.setAccessible(true); try { map.put(f.getName(), f.get(node.getData())); } catch (IllegalAccessException e) { } } } } List<Map<String, Object>> childrenList = new ArrayList<>(); for (int i = 0; i < node.getChildren().size(); i++) { Map<String, Object> child = new HashMap<>(); treeToMap(node.getChildren().get(i), child); childrenList.add(child); } if(!map.containsKey("total")) { map.put("children", childrenList); }else{ map.put("rows", childrenList); } } }
使用的外部接口
/** * 外部方法,方便使用 * @param list 单页的数据 * @param total 分页参数总共有多少记录 * @param keys 建立树节点的字段数组 * @param names 树节点显示的字段数据 * @param <T> * @return */ public static <T> String listToTreeGridJson(List<T> list, long total, String[] keys, String[] names) { if (list.size() == 0) { return ""; } if (names.length < keys.length) { throw new RuntimeException("names的个数不能小于keys的个数!"); } TreeGrid<T> tree = new TreeGrid(); tree.setTotal(total); tree.addNode(null, list.get(0)); tree.getRoot().setKey(new TreeGridNode.NodeKey("root", 0L)); for (T data : list) { tree.addNode(data, keys, names); } return tree.toTreeGridJsonString(); }