-1

我参考了很多关于 json 递归的网站,如下所示

JavaScript 递归不能正常工作
jQuery 对对象的递归迭代

但他们中的大多数要么知道密钥,要么使用已知密钥进行迭代。如果 key & value 都是字符串,例如 {"firstname" : "lastname"} & then function (k,v) 可以分别将 key & value 作为 k & v,则 $.each 也很有效。

但是,如果 json 对象很复杂并且我们不知道什么是关键,例如在 JSON1 和 JSON2 中的键不同,JSON1 中的键 1、3、2 被 JSON2 响应中的 5、6 和 10 替换。

JSON1

{
    "one": true,
    "three": [
        "red",
        "yellow",
        [
            "blue",
            "azure",
            "cobalt",
            "teal"
        ],
        "orange"
    ],
    "two": 19.5
}

JSON2

{
    "five": true,
    "six": [
        "red",
        "yellow",
        [
            "blue",
            "azure",
            "cobalt",
            "teal"
        ],
        "orange"
    ],
    "ten": 19.5
}

如果我们可以知道密钥名称然后进行比较就可以了。更容易比较密钥,因为这个 tagName 应该按照下面 URL 中的建议工作

jQuery 可以提供标签名称吗?

但是对于普通的 json 对象属性标记名似乎不起作用。检查诸如 text()、attr() 之类的 firefox 属性并没有得到我的 tagName。我想要的是循环遍历 json 对象(实际上我使用 xml2json 插件将 xml 转换为上述 json 格式)并比较键(如果存在)并执行操作。我知道在 XML 中你可以使用 nodeName 来做同样的事情。我应该如何使用 JSON 对象做同样的事情。

4

2 回答 2

0

我不完全确定你在找什么,但我会把它扔在这里。

如果您使用诸如for (key in jsonObj) { ... }then 之类的东西,您可以在不知道键名的情况下遍历对象。在循环内部,key将为您提供当前键名并jsonObj[key]为您提供相应的值。

例如,如果我们使用您的“JSON1”对象:

for(key in JSON1) 
{
   alert(key + ": " + JSON1[key]);
}

第一个警报将显示:one: true

我怀疑你也可以通过递归来访问嵌套对象。

于 2012-07-03T16:55:06.530 回答
0

一个快速的解决方案是使用 jQuery.parseJSON http://api.jquery.com/jQuery.parseJSON/

或者你可以这样做:

var obj = JSON.parse(JSON1);

但是,并非所有浏览器都支持 JSON 对象,您可能需要查看: https ://github.com/douglascrockford/JSON-js/blob/master/json2.js

包含该库不必更改您的代码,因为它使 JSON 对象成为全局对象(以防浏览器不支持它)。

它获取您的 JSON 字符串,对其进行解析,然后将其转换为 obj 所以对于 JSON1,您将得到如下内容:

obj.one 给你 value = true

obj.two 给你值 = ["red","yellow",["blue","azure","cobalt","teal"],"orange"]

obj.three 给你的值 = 19.5

然后就可以遍历obj属性了:

for (var prop in obj) {
    if (obj.hasOwnProperty(prop)) {        
        switch(prop){
        {
            case "one":
                //Do stuff here
                break;
            case "two":
                //Do stuff here
                break;
            case "three":
                //Do stuff here
                break;
        }
    }
}

此外,使用 obj[prop] 将为您提供值而不是名称。例如,在循环期间如果遇到:prop = "three"

然后:

对象[道具] = 19.5

于 2012-07-03T17:04:56.887 回答