2

我正在尝试解析这个 JSON 字符串:

{ "RESULTS": [ { "name": "Thessaloniki GR", "type": "Sailing", "l": "/sailing-weather/beach:Porto%20Carras%20Marina 45904" }, { "name": "Thessaloniki, Greece", "type": "city", "c": "GR", "zmw": "00000.1.16622", "tz": "Europe/Athens", "tzs": "EET", "l": "/q/zmw:00000.1.16622" } ] }

这里检索

这是我的片段:

$(document).ready(function () {

  $("#w11").autocomplete({
        source: function (a, b) {
            $.ajax({
                url: "http://autocomplete.wunderground.com/aq",
                dataType: "jsonp",
                data: {
                    format: "jsonp",
                    query: a.term
                },
                success: function (a) {
                    for (i in data.RESULTS) {
                        console.log(data.RESULTS);
                    }
                }
            })
        }
    });


});​

Uncaught SyntaxError: Unexpected token :这在第一行给了我一个错误{ "RESULTS": [

如何解析 JSON 结果?

4

1 回答 1

9

您已经告诉 jQuery 期待JSON-P,而不是JSON

dataType: "jsonp"

...但结果是 JSON。JSON-P 和 JSON 是根本不同的东西。这是一个示例 JSON 响应:

{"foo": 42}

下面是 JSON-P 响应的样子:

callback({"foo": 42});

或者

callback({foo: 42});

如果http://autocomplete.wunderground.com/a与您的代码正在运行的文档不在同一个来源,您将无法通过 ajax 从中检索 JSON,因为相同的来源策略(除非有问题的服务器支持CORS,允许您的请求来源,并且用户拥有的浏览器也支持CORS)。我怀疑这就是您尝试使用跨域工作的 JSON-P 的原因。但问题是,服务器也必须支持 JSON-P。尽管format=jsonp在 URL 中,服务器没有使用 JSON-P 响应,而是使用 JSON。

在评论中,您链接到他们的 API 文档,这表明他们确实支持 JSON-P,只是在 URL 中使用了非标准参数名称(cb而不是更常见的callback)。

所以这应该可行(我还解决了我在对该问题的评论中提到的代码的问题):

$.ajax({
    url:      "http://autocomplete.wunderground.com/aq",
    dataType: "jsonp",
    jsonp:    "cb",     // <================= New bit is here
    data:     {
        format: "json", // <=== "json" not "jsonp" according to the docs, but I think the "cb" argument overrides it anyway
        query:  a.term
    },
    success:  function (data) { // <=== `data`, not `a`
        var i;
        for (i in data.RESULTS) {
            console.log(data.RESULTS[i]); // <=== Use [i] here
        }
    }
}); // <=== Semicolon was missing

事实上它确实有效:Live Example | 来源

jsonp参数告诉 jQuery 使用哪个 URL 参数来定义 JSON-P 回调的名称。默认为标准callback,但该 API 使用非标准参数。

于 2012-12-16T08:40:16.360 回答