小编典典

jQuery.ajax()解析器错误

json

当我尝试从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

但是使用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; }
}

阅读 233

收藏
2020-07-27

共1个答案

小编典典

这是因为您要告诉jQuery您期望返回JSON-P而不是JSON。但是返回的是JSON。JSON-
P的命名错误极高,以一种不会引起混乱的方式命名。这是通过标签将数据传送到函数的 约定script。相反,JSON是一种数据格式。

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和您的浏览器也可以)。

2020-07-27