easyui的treegrid数据转换代码

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();
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值