意外的令牌:尝试解析JSON字符串时

时间:2012-12-16 08:36:43

标签: jquery json

我正在尝试解析这个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" } ] }

here

检索

这是我的代码:

$(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结果?

1 个答案:

答案 0 :(得分: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与运行代码的文档不在同源,则由于Same Origin Policy,您将无法通过ajax从中检索JSON(除非服务器在问题支持CORS,允许您的请求来源,以及用户也支持CORS的浏览器)。我怀疑这就是为什么你试图使用JSON-P,它起源于交叉起源。但问题是,服务器也必须支持JSON-P。尽管URL中有format=jsonp,但服务器没有使用JSON-P响应,而是使用JSON响应。

在评论中,您链接到their docs for that API,表明他们支持JSON-P,只是在URL中使用非标准参数名称{{1而不是更常见的cb)。

所以这应该有用(我还修复了我在问题评论中提到的代码问题):

callback

事实上它确实有效:Live Example | Source

$.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 参数告诉jQuery用于定义JSON-P回调名称的URL参数。默认值为标准jsonp,但该API使用非标准参数。