【问题标题】:Errors when trying to loop through an array with javascript尝试使用 javascript 遍历数组时出错
【发布时间】:2013-09-23 09:20:55
【问题描述】:

我正在尝试访问以 javascript 数组返回的 2 个搜索结果。

如果在此处检查如何操作:Access / process (nested) objects, arrays or JSON 然后我根据这个结果集尝试了它:

{
    "responseHeader":{
        "status":0,
        "QTime":2,
        "params":{
            "facet":"false",
            "fl":"id,title,friendlyurl,avatar,locpath,objectid,objecttype",
            "indent":"off",
            "q":"title_search:*castle*",
            "wt":"json",
            "defType":"lucene"
        }
    },
    "response":{
        "numFound":2,
        "start":0,
        "docs":[
            {
                "title":"castle a",
                "objecttype":1,
                "friendlyurl":"castle-a",
                "avatar":"6_887_castle-a.JPG",
                "objectid":6
            },
            {
                "title":"castle b",
                "objecttype":1,
                "friendlyurl":"castle-b",
                "avatar":"794_360_13j-castle-by-night.jpg",
                "objectid":794
            }
        ]
    }

}

for (var i = 0, l = data.response.numFound; i < l; i++) {
    console.log(data.response.docs[i].title);
    console.log(data.response.docs[i].objecttype);
    console.log(data.response.docs[i].friendlyurl);
}

如果我直接调用服务,我确实会返回结果,但我的 Chrome 控制台日志中仍然会收到 data=null。为什么会这样?

这里是相关代码

    $("#searchfavs").change(function () {
        $.ajax({
            type: "GET",
            url: "/weddingservice/searchfavoritecompany/?q=" + $("#searchfavs").val(),
            data: "",
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            success: function (data) {
                data = $.parseJSON(data);
                console.log(data);
                console.log(data.response);
                console.log(data.response.numFound);

                for (var i = 0, l = data.response.numFound; i < l; i++) {
                    console.log(data.response.docs[i].title);
                    console.log(data.response.docs[i].objecttype);
                    console.log(data.response.docs[i].friendlyurl);
                }


            }
        });
        $(this).parent().hide('slow');
    });

如何循环查看我的结果?

【问题讨论】:

  • @PeeHaa: s/result/response?
  • 是的。您的示例数据集在撒谎,或者您的代码在撒谎。
  • data.result.docs.length,但你的对象只有data.response.docs.length
  • data 是一个包含 JSON 的字符串,所以你必须先解析它。由于您在该步骤中遇到错误,因此您的 JSON 必须以某种方式无效(但您发布的内容似乎是有效的)。 data.resultdata.items 不起作用,因为字符串没有这样的属性。您应该更仔细地阅读链接的问题;)并且不要忘记执行console.log(data)console.log(data.response) 等来查看对象实际包含哪些属性。
  • 啊: 您不能复制粘贴 JSON 并将其放入字符串中。您必须转义每个\,即"fq":"userid:\"C325D42C-A777-4275-BDD2-D7810A8AB9AB\"" 必须是字符串内的"fq":"userid:\\"C325D42C-A777-4275-BDD2-D7810A8AB9AB\\""

标签: javascript arrays json loops


【解决方案1】:

您的data不是 JSON。它已经是JS object,因为您已经通过了dataType: 'json'。所以你不需要使用data = $.parseJSON(data);再次解析它

来自jQuery docs

数据类型(默认:智能猜测(xml、json、脚本或 html))
类型:字符串

您期望从服务器返回的数据类型。如果没有指定,jQuery 将尝试根据响应的 MIME 类型推断它(XML MIME 类型将产生 XML,在 1.4 中 JSON 将产生一个 JavaScript 对象,在 1.4 中脚本将执行脚本,其他任何东西都会作为字符串返回)。可用的类型(以及作为第一个参数传递给成功回调的结果)是:

json”:将响应评估为 JSON 并返回一个 JavaScript 对象。 JSON数据被严格解析;任何格式错误的 JSON 都会被拒绝并引发解析错误。从 jQuery 1.9 开始,空响应也会被拒绝;服务器应该返回 null 或 {} 的响应。 (有关正确的 JSON 格式的更多信息,请参阅 json.org。)


另外data 不包含任何items。它包含response。为方便起见,找到的项目数量已经在data.response.numFound 中。所以你可以像这样循环

for (var i = 0, l = data.response.numFound; i < l; i++) {
    console.log(data.response.docs[i].title);
    console.log(data.response.docs[i].objecttype);
    console.log(data.response.docs[i].friendlyurl);
}

另外请注意,我刚刚发现您的 JSON 格式不正确。 JSON 必须是有效的才能使这项工作。仔细尝试了解comment@FelixKling 所做的。

【讨论】:

  • 但它不能解决问题 Uncaught SyntaxError: Unexpected token C。 parseJSON 似乎对userid:\"C325D42C-A777-4275-BDD2-D7810A8AB9AB\" 不满意。例如:jsfiddle.net/45zcz
  • @MathieuImbert:完全正确。我像 shiplu 建议的那样更正了我的代码,但现在我仍然收到“意外的令牌 C”错误。
  • @Flo:如果将 JSON 放入 JS 字符串文字中,则必须转义每次出现的 \。 JSON 本身是有效的,但是将它放在 JS 文字中会使其无效。
  • @Flow 我从你的服务中得到{"Message":"Authentication failed.","StackTrace":null,"ExceptionType":"System.InvalidOperationException"
【解决方案2】:

我发现了问题:

您的响应数据已经是一个对象,因此无需解析。当您尝试 parseJson 时,它会返回 null。

data = $.parseJSON(data); //remove this line which is returning null and try
console.log(data);
console.log(data.response);
console.log(data.response.numFound);

【讨论】:

    猜你喜欢
    • 2015-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多