记录一个比较恶心得json字符串的需求,仍然有关于Ext.js,有关于树的结构。

1 篇文章 0 订阅
1 篇文章 0 订阅

1.环境
Ext.js 4.2版本,官方插件 TreePicker.js 试下一个combox的下拉树控件。
本人网上找了很久的下拉框控件,发现许多是由大佬改造等,也有在官方可下载的demo中找到,最终确定采用我们项目的版本。观看其中的控件类的实现代码发现其需要的store为Ext.data.TreeStore。
推荐查看此人博客https://www.cnblogs.com/hythzx/articles/4184585.html
gitee的项目demo https://gitee.com/hythzx/ExtJs4.2TreePicker/blob/master/TreePicker/src/main/webapp/data/treeSingle.json#
2.发现所需的json数据格式

[
    {
        "icon": "",
        "text": "人员列表",
        "cls": "",
        "check": false,
        "roleid": "",
        "ord": "",
        "children": [
            {
                "icon": "",
                "text": "人员1",
                "cls": "",
                "roleid": "",
                "ord": "",
                "children": "",
                "pid": "",
                "table": "",
                "code": "",
                "leaf": true,
                "expanded": false,
                "access": "",
                "org": "",
                "type": "",
                "password": "123",
                "CATANO": "",
                "id": "USER_1000078",
                "username": "xuyx",
                "rolename": "",
                "parentCataID": "",
                "PARENTCATAID": "",
                "cataNO": "",
                "name": ""
            },
            {
                "icon": "",
                "text": "人员2",
                "cls": "",
                "roleid": "",
                "ord": "",
                "children": "",
                "pid": "",
                "table": "",
                "code": "",
                "leaf": true,
                "expanded": false,
                "access": "",
                "org": "",
                "type": "",
                "password": "123",
                "CATANO": "",
                "id": "USER_1000080",
                "username": "shenl",
                "rolename": "",
                "parentCataID": "",
                "PARENTCATAID": "",
                "cataNO": "",
                "name": ""
            },
            {
                "icon": "",
                "text": "人员3",
                "cls": "",
                "roleid": "",
                "ord": "",
                "children": "",
                "pid": "",
                "table": "",
                "code": "",
                "leaf": true,
                "expanded": false,
                "access": "",
                "org": "",
                "type": "",
                "password": "123",
                "CATANO": "",
                "id": "USER_1000073",
                "username": "ruiqy",
                "rolename": "",
                "parentCataID": "",
                "PARENTCATAID": "",
                "cataNO": "",
                "name": ""
            },
            {
                "icon": "",
                "text": "人员4",
                "cls": "",
                "roleid": "",
                "ord": "",
                "children": "",
                "pid": "",
                "table": "",
                "code": "",
                "leaf": true,
                "expanded": false,
                "access": "",
                "org": "",
                "type": "",
                "password": "123",
                "CATANO": "",
                "id": "USER_1000079",
                "username": "zhoulj",
                "rolename": "",
                "parentCataID": "",
                "PARENTCATAID": "",
                "cataNO": "",
                "name": ""
            },
            {
                "icon": "",
                "text": "人员5",
                "cls": "",
                "roleid": "",
                "ord": "",
                "children": "",
                "pid": "",
                "table": "",
                "code": "",
                "leaf": true,
                "expanded": false,
                "access": "",
                "org": "",
                "type": "",
                "password": "123",
                "CATANO": "",
                "id": "USER_1000077",
                "username": "jinyj",
                "rolename": "",
                "parentCataID": "",
                "PARENTCATAID": "",
                "cataNO": "",
                "name": ""
            }
        ],
        "pid": "",
        "table": "",
        "code": "",
        "type": "",
        "org": "",
        "access": "",
        "expanded": false,
        "password": "",
        "CATANO": "",
        "id": "ORG_1000050",
        "username": "",
        "rolename": "",
        "parentCataID": "",
        "PARENTCATAID": "",
        "cataNO": "",
        "name": ""
    }
]

据本人观察具有children的节点是不能由leaf属性的,具有leaf属性的节点为叶子节点,其值必须为true.如果不满足此结构,其会不停的请求后台接口。js研究了半天也没发现具体发请求的方法在哪一块,索性放弃,从后端树结构来解决。
解决方案1.定位定义一个node节点,从构建树的时候区分好叶子节点上多一个leaf属性创建树结构。由于又要创建树结构从xml层往上写,比较麻烦,暂未进行

class BaseNode{
    String id;
	String pid;
	String text;
}
class TreeNode extends BaseNode{
	List<BaseNode> children;
}
class Leaf extends BaseNode{
	boolean leaf;
}

解决方案2:通过对生成的json串来进行操作。采用工具阿里的fastjson工具。原先的树节点会返回所有的属性,即均包含leaf属性,且leaf属性位false.超级不满足我的需求。
采用PropertyFilter、ValueFilter来处理字符串。

         PropertyFilter profilter = new PropertyFilter(){
            @Override
            public boolean apply(Object object, String name, Object value) {
                JSONObject parseObject = JSON.parseObject(JSONUtil.toJsonStr(object));
                boolean contains = parseObject.keySet().contains("children");
                if(contains&&ObjectUtil.isNotNull(parseObject.get("children"))){
                    if(name.equalsIgnoreCase("leaf")){
                        //false表示leaf字段将被排除在外
                        return false;
                    }
                }
                return true;
            }

        };
      
        ValueFilter valueFilter = new ValueFilter() {
            @Override
            public Object process(Object o, String propertyName, Object propertyValue) {
                if(propertyName.equals("leaf")){
                    return true;    //返回修改后的属性值对象
                }
                return propertyValue;
            }
        };
         String res = JSON.toJSONString(root, new SerializeFilter[]{profilter, valueFilter});

从上述代码中,首先筛掉children节点的leaf属性,再晒剩余的leaf属性的值转为true.fastjson还是很好用的,也采用了工具类hutool

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.4</version>
        </dependency>
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.3.9</version>
        </dependency>

以后有诸如此类的需求还是推荐使用。作为后端开发,首先想的肯定是后端实现。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值