2

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

如果在此处检查如何执行此操作:访问/处理(嵌套)对象、数组或 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');
    });

如何循环查看我的结果?

4

2 回答 2

3

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

来自jQuery 文档

数据类型(默认:智能猜测(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 必须是有效的才能使这项工作。仔细尝试理解@FelixKling 所做的评论。

于 2013-09-18T14:45:13.183 回答
0

我发现了问题:

您的响应数据已经是一个对象,因此无需解析。当您尝试 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);
于 2013-09-27T07:11:32.217 回答