来自jQuery的JSON响应会引发“无效标签”

$.ajax({ beforeSend: function(xhr) { xhr.setRequestHeader('Authorization', "Basic YWRtaW46YWRtaW4="); }, url: "https://test.com/incident.do?JSON&callback=?&sysparm_action=getRecords", dataType: "json", contentType: "application/json", method: 'GET', success: function(a,b,c) { alert(a); } }); 

我按下按钮调用此函数… Firebug显示我得到这个JSON响应(我知道它是有效的)[为了清晰起见截断]

 { "records": [ { "service_offering": "", "number": "INC0000009" }, { "service_offering": "", "number": "INC0000010" } ] } 

Firebug显示错误“无效标签https://test.com/incident.do?JSON&callback=jsonp1279049933243&sysparm_action=getRecords第1行

我怎样才能解决这个问题? 谢谢!

你的回答是JSON,这是有效的,但这不是jQuery所期待的。 当你指定&callback=? 在URL中,jQuery期待一个JSONP响应,看起来不同,你的响应应该

 jsonp1279049933243({ "records": [ { "service_offering": "", "number": "INC0000009" }, { "service_offering": "", "number": "INC0000010" } ] }); 

指定callback=?时会发生什么callback=? 是jQuery为您的success函数生成一个名称,在本例中为jsonp1279049933243 ,JSONP只是在页面中生成一个标签,所以当它获取该URL时,它实际上只包含一个JavaScript文件,运行一个函数,但是而不是这个:

  

现在有效的是:

  

...这是无效的JavaScript。 现在它当然通过src=https://test.com/incident.do?JSON&callback=jsonp1279049933243&sysparm_action=getRecords ,但无效的语法/标签错误是相同的。

您可能想validation该服务是否支持jsonp。 如果不是,则需要设置服务器端代理。

使用jQuery获取json数据会返回无效的标签错误

你说你知道它有效。 你能将它汇集到parseJSON函数中,看看你有没有运气呢?

$ .parseJSON(str_json);

注意:您还没有提到您正在使用的jQuery版本。 此方法仅在jQuery 1.4.1及更高版本中可用。

你确定json有效吗? 检查它在JSONLintvalidation。

尝试将数据作为纯文本并将其转换为客户端的json。 我使用“ http://www.json.org/json2.js ”脚本来执行此操作。 它帮助我解决了我的应用程序中的“无效标签”问题。 (我提到了脚本,因为eval()函数没有帮助,不明白为什么……)

祝好运 :)

如果您使用的是1.5.2(可能是旧版本),则可以禁用jsonp,如果您不需要或想要它。

因此,对于所有ajax调用,请在页面上的某处添加:

 $.ajaxSetup({ jsonp: null, jsonpCallback: null }); 

或者只为一个电话,添加:

 jsonp: null, jsonpCallback: null, 

所以在你的例子中:

 $.ajax({ beforeSend: function(xhr) { xhr.setRequestHeader('Authorization', "Basic YWRtaW46YWRtaW4="); }, url: "https://test.com/incident.do?JSON&callback=?&sysparm_action=getRecords", dataType: "json", contentType: "application/json", method: 'GET', jsonp: null, jsonpCallback: null, success: function(a,b,c) { alert(a); } });