当我尝试从http://api-v3.deezer.com/1.0/search/album/?q=beethoven&index=2&nb_items=2&output=json使用以下方法获取JSON 时:
(jQuery 1.6.2) $.ajax({ type: "GET", url: url, dataType: "jsonp", success: function (result) { alert("SUCCESS!!!"); }, error: function (xhr, ajaxOptions, thrownError) { alert(xhr.statusText); alert(xhr.responseText); alert(xhr.status); alert(thrownError); } });
我得到: parsererror; 200; undefined; jquery162******************** was not called
parsererror; 200; undefined; jquery162******************** was not called
但是使用http://search.twitter.com/search.json?q=beethoven&callback=?&count=5的JSON 可以正常工作。两者都是有效的JSON格式。那么这个错误是关于什么的呢?
[更新]
@ 3ngima,我已经在asp.net中实现了它,它工作正常:
$.ajax({ type: "POST", url: "WebService.asmx/GetTestData", data: "{}", contentType: "application/json; charset=utf-8", dataType: "json", success: function (result) { alert(result.d); } });
WebService.asmx:
[WebMethod] public string GetTestData() { try { var req = System.Net.HttpWebRequest.Create("http://api-v3.deezer.com/1.0/search/album/?q=beethoven&index=2&nb_items=2&output=json"); using (var resp = req.GetResponse()) using (var stream = resp.GetResponseStream()) using (var reader = new System.IO.StreamReader(stream)) return reader.ReadToEnd(); } catch (Exception) { return null; } }
这是因为您要告诉jQuery您期望返回JSON-P而不是JSON。但是返回的是JSON。JSON- P的命名错误极高,以一种不会引起混乱的方式命名。这是通过标签将数据传送到函数的 约定script。相反,JSON是一种数据格式。
script
JSON范例:
{"foo": "bar"}
JSON-P的示例:
yourCallback({"foo": "bar"});
JSON-P之所以有效,是因为JSON是JavaScript文字表示法的子集。JSON- P只是一个承诺,即如果您告诉服务您正在调用要回调的函数名(通常通过callback在请求中放置参数),则响应将采用的形式functionname(data),其中data将是“ JSON ”(或更常见的是JavaScript文字,这可能 不太 一样)。您应该在script标记的JSON中使用JSON-P URL src(jQuery为您执行此操作),以避开Same Origin Policy,该策略可防止ajax请求从其原始文档以外的其他来源请求数据(除非服务器支持)CORS和您的浏览器也可以)。
callback
functionname(data)
data
src