jQuery JSON响应总是触发ParseError错误

34

我正在尝试使用jQuery和JSON执行一些基本操作。目前在jQuery接受来自我的Play框架应用程序的JSON响应方面遇到了困难。以下是一个简化版本的代码,但仍会产生错误。

$.ajax({
    type: 'POST',
    url: "@{FrontEnd.isUsernameAvailable()}",
    data: "name=thisnameisavailable",
    cache: false,
    success: function(data) {
        console.log("Success... ");
    },
    error: function(jqXHR, textStatus, errorThrown) {
        console.log("Error... " + textStatus + "        " + errorThrown);
    },
    dataType: 'json'
});

错误回调总是被触发。它显示:

Error... parsererror jQuery15001997238997904205_1298484897373 没有被调用

通过Firebug检查返回的JSON未显示任何错误,各种JSON lint工具也验证无误。将dataType更改为"text"会使成功被调用。但是我正在尝试将isUsernameAvailable调用作为jQuery验证插件的一部分,因此我需要它返回有效的JSON。


你确定响应是 application/json 类型的吗(我认为答案是肯定的;)),并且你的 JSON 数据格式如下:{"field":"value",...}。如果您的值是字符串类型而不是布尔或整数,则双引号有时很重要...而且不能有逗号孤立存在。无论如何,看起来您已经找到了解决办法! - mandubian
在你的问题中,我的回答是...我的PHP使用echo简单文本返回,所以将dataType更改为'text'就完成了工作。谢谢 :) - Pitto
4个回答

34
也许我理解有误,但是你不能将 dataType 设置为 text 并且将返回的数据使用 JSON.parse() 吗?
success: function(data) {
    data = JSON.parse(data);
    // process data
},

编辑后添加经大家普遍认可的解决方案(之前仅为评论):

我刚刚查看了api.jquery.com/jQuery.ajax,看起来在 jQuery 1.5 中你可以进行某种类型转换。"多个,以空格分隔的值:自 jQuery 1.5 起,jQuery 可以将 dataType 从 Content-Type 标头中接收到的格式转化为您所需的格式。例如,如果您希望将文本响应视为 XML,请使用"text xml"用于 dataType。" 也许你可以尝试使用 "text json"。


这可能是我需要走的方向。我“需要”使用“JSON”的原因是,因为我正在使用的jQuery验证插件要求远程验证返回JSON。 - Chesrae
5
我刚刚查看了http://api.jquery.com/jQuery.ajax/,看起来在jQuery 1.5中,你可以进行某种类型的类型转换。“多个用空格分隔的值:自jQuery 1.5开始,jQuery可以将数据类型从Content-Type头接收到的类型转换为所需的类型。例如,如果您想要将文本响应视为XML,请使用“text xml”作为数据类型。”也许你可以尝试使用“text json”。 - ggutenberg
2
我只是在jQuery验证插件代码中将“json”更改为“text json”,一切都完美地运作了。谢谢你的回答,但我仍然困惑为什么“json”无法工作。Content-Type头被设置为application/json。 - Chesrae
今天遇到了同样的问题,不兼容的验证插件是原因,这种情况下是与 ASP.NET MVC3 一起提供的插件。 - Andrew
如果有人在将来遇到类似的问题,我可以提供帮助。在ajax调用中指定了json,返回了完美格式化的json,并将内容类型设置为application/json,但仍然触发错误。然后我将我的php脚本复制粘贴到notepad++中,明确地重新保存而没有BOM编码,嘿!这就是一直以来困扰我的问题。 - orfdorf
显示剩余3条评论

12

我在升级到jQuery 1.5后立即遇到了相同的错误。原来是因为我也在使用jquery验证插件,而该插件与jQuery 1.5不兼容。如果我删除jquery验证插件,则dataType json的$.ajax()可以正常工作。

有关jquery验证插件不兼容性的更多信息,请单击此处: http://bugs.jquery.com/ticket/8118


这个问题花了我一些时间才找到,原因是jquery.validate中的冲突。 - Nick Josevski
1
jQuery Validation的新版本(1.8)修复了这个问题,并且与jQuery 1.5.x兼容。更多信息请访问:http://jquery.bassistance.de/validate/changelog.txt - Jim Geurts
这确实是正确的答案,应该标记为正确。谢谢JonnyO! - Dav
1
谢谢!我已经和这个问题斗争了两个小时,试图找出我做错了什么。 - Craig W.
@Jim:我下载了新版本的jQuery Validation,如果使用jquery.validate.min.js文件,问题仍然存在。如果使用jquery.validate.js文件,似乎可以正常工作。 - Craig W.

3

我也遇到了"parsererror jQueryNNNN_NNN was not called"的问题(使用jsonp和jQuery 1.7.2)。 原因是返回的JSON结构中有一个值包含了换行符。 希望这能对某些人有所帮助。


2
我收到了一个“parseerror”的错误提示,因为“url”参数中包含了一个“callback=?”的部分这是一个激活JSONP功能的魔法字符串
由于我的服务器端的REST API已经从JSONP更改为JSON,从它返回的数据格式不再与带有“callback=?”的jQuery.getJSON(...)兼容。在这种情况下,jQuery.getJSON(...)将调用fail回调而不是success回调。
我通过从url参数中删除callback =?部分来解决此问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接