我正在尝试解析这个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结果?
答案 0 :(得分:9)
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使用非标准参数。