jQuery.ajax() 解析器错误
Posted
技术标签:
【中文标题】jQuery.ajax() 解析器错误【英文标题】:jQuery.ajax() parsererror 【发布时间】:2011-10-02 09:33:02 【问题描述】:当我尝试从 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;
【问题讨论】:
您可以参考***.com/a/29485687/3126639。 async: false 很重要。 【参考方案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
标记的src
(jQuery 为您做的)中使用JSON-P URL,以绕过Same Origin Policy,它可以防止ajax 请求从它们发起的文档以外的源请求数据in(除非服务器支持 CORS 并且您的浏览器也支持)。
【讨论】:
顺便说一句,这个 API 似乎不支持 JSON-P(我只发现了这个:deezer.com/en/developers/simpleapi)。 哦,我明白了。嗯,如果我将数据类型设置为 json 它也不起作用。 @Stack:它不会这样做,除非您调用它的页面位于api-v3.deezer.com
,因为 SOP(请参阅答案中的链接)。
哦,我明白了。我现在知道了。谢谢。【参考方案2】:
如果服务器不支持cross domain
请求,您可以:
-
创建服务器端代理
向您的代理发出 ajax 请求,然后代理会从服务中获得
json
,然后
返回响应,然后您可以对其进行操作...
在php中你可以这样做
proxy.php 包含以下代码
<?php
if(isset($_POST['geturl']) and !empty($_POST['geturl']))
$data = file_get_contents($_POST['geturl']);
print $data;
?>
然后你像这样向你的代理发出 ajax 请求
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js" type="text/javascript"></script>
<script type="text/javascript">
$(function()
$("#btn").click(function()
alert("abt to do ajax");
$.ajax(
url:'proxy.php',
type:"POST",
data:geturl:'http://api-v3.deezer.com/1.0/search/album/?q=beethoven&index=2&nb_items=2&output=json',
success:function(data)
alert("success");
alert(data);
);
);
);
</script>
经过试验和测试,我得到了 json 响应......
【讨论】:
【参考方案3】:我终于找到了解决方案。首先,webservice 或页面中的 webmethods 对我不起作用,它总是返回 xml,在本地可以正常工作,但在像 godaddy 这样的服务提供商中却不行。
我的解决方案是在 .net 中创建一个 .ahsx
,一个处理程序,并使用传递 jsonp 的 jquery 回调函数包装内容,它可以工作。
[System.Web.Script.Services.ScriptService]
public class HandlerExterno : IHttpHandler
string respuesta = string.Empty;
public void ProcessRequest ( HttpContext context )
string calls= context.Request.QueryString["callback"].ToString();
respuesta = ObtenerRespuesta();
context.Response.ContentType = "application/json; charset=utf-8";
context.Response.Write( calls +"("+ respuesta +")");
public bool IsReusable
get
return false;
[System.Web.Services.WebMethod]
private string ObtenerRespuesta ()
System.Web.Script.Serialization.JavaScriptSerializer j = new System.Web.Script.Serialization.JavaScriptSerializer();
Employee[] e = new Employee[2];
e[0] = new Employee();
e[0].Name = "Ajay Singh";
e[0].Company = "Birlasoft Ltd.";
e[0].Address = "LosAngeles California";
e[0].Phone = "1204675";
e[0].Country = "US";
e[1] = new Employee();
e[1].Name = "Ajay Singh";
e[1].Company = "Birlasoft Ltd.";
e[1].Address = "D-195 Sector Noida";
e[1].Phone = "1204675";
e[1].Country = "India";
respuesta = j.Serialize(e).ToString();
return respuesta;
//class
public class Employee
public string Name
get;
set;
public string Company
get;
set;
public string Address
get;
set;
public string Phone
get;
set;
public string Country
get;
set;
这是使用 jquery 的调用:
$(document).ready(function ()
$.ajax(
// url: "http://www.wookmark.com/api/json",
url: 'http://www.gjgsoftware.com/handlerexterno.ashx',
dataType: "jsonp",
success: function (data)
alert(data[0].Name);
,
error: function (data, status, errorThrown)
$('p').html(status + ">> " + errorThrown);
);
);
完美运行
加布里埃尔
【讨论】:
以上是关于jQuery.ajax() 解析器错误的主要内容,如果未能解决你的问题,请参考以下文章
JQuery - $.ajax() - 使用 JSONP 的跨域 - 仅在 IE 8 中获取“解析器错误”(在 IE 7 中工作)