在JSON解析后无法读取undefined的属性

时间:2016-11-04 14:31:00

标签: javascript jquery json

我在我的代码中做了一个ajax请求,它运行良好。之后我想只提取必要的信息并将其重新发布到另一个脚本。到目前为止,这是我的代码:

$.ajax({
        type: "POST",
                url: url,
                data: {xhr_id: xhr_id},
                success: function (jsondata) {

                    var product_data = [];

                      for (var i = 0; i <= 3; i++) {

                        //alert(jsondata.products[i].product_description.toSource());

                        product_data[i] = {};
                        product_data[i]["product" + i] = jsondata.products[i].product_description;

                        //alert(product_data[i]["product" + i].toSource());
                    }
                },
                dataType: "json"
        });

问题是两个警报都正常工作,显示我想要的信息。但是,我收到错误消息&#34; Uncaught TypeError:无法读取属性&#39; product_description&#39;未定义&#34;这打破了脚本并阻止我做任何其他事情。我做错了什么,有什么想法吗?

2 个答案:

答案 0 :(得分:1)

&#39; PRODUCT_DESCRIPTION&#39;未定义&#34;这意味着你正试图访问未定义变量的属性。这意味着&#34; jsondata.products [i]&#34;导致由于索引超出范围而发生的未定义值。在jsondata 3或4中返回多少记录,检查并调整for循环中的条件

答案 1 :(得分:0)

$ .ajax的success()函数中的参数是一个字符串。你必须通过一个解析函数来制作json。请参阅下面修改但未经过测试的代码。

$.ajax({
        type: "POST",
                url: url,
                data: {xhr_id: xhr_id},
                success: function (jsondata) {
                    var oData;
                    try { oData=jQuery.parseJSON(jsondata) }
                    catch(err) {
                        alert("Problem parsing json string : " + jsondata)
                        return false
                    }

                    var product_data = [];

                      for (var i = 0; i <= 3; i++) {

                        //alert(oData.products[i].product_description.toSource());

                        product_data[i] = {};
                        product_data[i]["product" + i] = oData.products[i].product_description;

                        //alert(product_data[i]["product" + i].toSource());
                    }
                },
                dataType: "json"
        });