-2
{
    "Items": [
        {
            "local": "padaria",
            "item1": "leite",
            "item2": "pao"
        }

    ],
}

问题是我没有设法去 a JSON,并且收到此错误:

错误:未捕获的 ReferenceError:未定义 item1

我的代码:

var obj = jQuery.parseJSON(retorno);

for (var i = 0; i < obj[0].Items.length; i++) {
    function getObjectLength(obj) {
        var length = 0;

        for (var p in obj) {
            if (obj.hasOwnProperty(p)) {
                length++;
            }
        }

        return length;
    }

    var t;

    for (var a = 0; a < getObjectLength(obj[0].Items[i]); a++) {
        if (a > 0) {
            t = (obj[0].Items[i].
                'item' + a);
        }

        console.log(obj[0].Items[i].t);
        console.log(t);
    };


    $("#thelist").append('<li>' + obj[0].Items[i].local + '</li>');

}
4

2 回答 2

4

只要确保这一点:

1)

 {
"Items": [
    {
        "local": "padaria",
        "item1": "leite",
        "item2": "pao"
    }],
}

你在“]”之后有逗号(你知道:P)这使得解析器不解析 JSON

2)

     for (var a = 0; a < getObjectLength(obj[0].Items[i]); a++) {
     if (a > 0) {
         t = (obj[0].Items[i].
             'item' + a);
     }

你有语法错误 ==> obj[0].Items[i].'item'

你不能像这样使用 someobj.'key'

你可以使用 someobj["key"] 或 someobj.key

于 2013-06-16T18:57:36.247 回答
3

您的代码有几个问题。我已经在小提琴中修复了它

的结果var obj = jQuery.parseJSON(retorno);是一个包含一个项目的对象"Items"。这意味着随后的调用"Items"必须作为obj[0]or obj.Itemsor orobj["Items"]

但是您这样做是:

for (var i = 0; i < obj[0].Items.length; i++) {

基本上是在尝试但没有找到obj.Items.Items

下一个问题是您尝试访问按顺序命名的属性的方式"item" + a。因为名称查找生成是动态的,所以 Object Named-Key 表示法是访问它的正确方法

该代码必须转换为obj.Items[0].["item" + a]


现在介绍一些好的做法:

  • 您的 JSON 有一个尾随逗号。现在,尽管大多数浏览器会毫无问题地解析它,但旧版本的 IE 会失败,无论如何,这是一个不好的做法。

  • 因为 Javascript 中的对象、函数、变量等都在一个函数内,所以您的一些原始代码容易受到定义为提升/范围问题的影响。函数声明不应放在块中。要么使用函数表达式,要么将语句移到外部函数的顶部。

    因此,外部for()循环更改为:

    //Move outside, into the outermost block
    function getObjectLength(obj) {
        //...
    }
    for (var i = 0; i < obj.Items.length; i++) {
        //...
    }
    

    或者

    for (var i = 0; i < obj.Items.length; i++) {
        //Function Expression
        var getObjectLength = function (obj) {
            //...
        };
    
        //...
    }
    

    使用后者的问题,这里的函数表达式技术是在循环中创建函数是一个坏主意,因为在循环的每次迭代中都会创建一个新实例。


固定代码:

var obj = jQuery.parseJSON(retorno);
for (var i = 0; i < obj.Items.length; i++) {
    function getObjectLength(obj) {
        var length = 0;
        for (var p in obj) {
            if (obj.hasOwnProperty(p)) {
                length++;
            }
        }
        return length;
    }
    var t;
    for (var a = 0; a < getObjectLength(obj.Items[i]); a++) {
        if (a > 0) {
            t = (obj.Items[i]['item' + a]);
        }
        console.log(obj.Items[i].t);
        console.log(t);
    };
    $("#thelist").append('<li>' + obj[0].Items[i].local + '</li>');
}
于 2013-06-16T18:49:05.680 回答