js解析多层嵌套json数据,递归调用

需要处理接口返回的json数据,转为Easyui Tree可以接收的数据格式,怎么处理多层的json数据,json的数据返回大小不一定,属性也有变化,结构类似,只有@desc是根目录

例子:

{
    "srvcfg": {
        "tokenswitch": {
            "token_switch": {
                "#text": "0",
                "@desc": "切换开关"
            },
            "@desc": "token切换"
        },
        "commoncfg": {
            "srvtype": {
                "count": {
                    "#text": "1",
                    "@desc": "数量"
                },
                "srvtypeid1": {
                    "#text": "28900",
                    "@desc": "类型"
                },
                "@desc": "SrvTypeID的数量"
            },
            "binanry_msg_queue": {
                "count": {
                    "#text": "2",
                    "@desc": "消息队列数量"
                },
                "queuenum1": {
                    "#text": "10000",
                    "@desc": "消息队列号"
                },
                "queuenum2": {
                    "#text": "20000",
                    "@desc": "消息队列最小长度"
                },
                "queuesize1": {
                    "#text": "300",
                    "@desc": "小消息队列"
                },
                "queuesize2": {
                    "#text": "10000",
                    "@desc": "消息队列最大长度"
                },
                "@desc": "消息队列配置"
            },
            "srv_pwd": {
                "count": {
                    "#text": "1",
                    "@desc": "约定密码数量"
                },
                "srvtypeid1": {
                    "#text": "28900",
                    "@desc": "端口"
                },
                "pwd1": {
                    "#text": "dtvspwd",
                    "@desc": "dtvs密码"
                },
                "@desc": "服务器之间约定的密码"
            },
            "@desc": "这是SrvTypeID规定"
        }
    }
}
阅读 13.4k
2 个回答
        function formatToTreedata(_data, str) {
            var obj = {};

            str = str || "";

            obj.str = str;
            obj.data = _data;

            if(!_data["#text"]) {
                obj.text = _data["@desc"] || "a";
                obj.children = [];
                for(var i in _data) {
                    if(i == "#text" || i == "@desc") continue;

                    obj.children.push(formatToTreedata(_data[i], str + "." + i));

                }
            } else {
                obj.text = _data["@desc"] + ":" + _data["#text"];
            }
            return obj;
        }

首先我们来分析一波,数据结构不管是什么样的,人去解析和机器去解析肯定是通过类型type。

  1. 是里面有type类型,如a、b、c什么的,如果是这样我们肯定可以对应不同的类型设置不同的解析方案。

  2. 没有一个明确的type来标识,用的是名字,name和age肯定是两种不同的东西,那我们就可以通过key来判断了。

对于json里面有不是命名规则的东西,我们可以用过[]来访问

clipboard.png

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题