为什么jQuery.parseJSON()不能在所有服务器上运行?

时间:2011-01-19 21:27:53

标签: php javascript jquery json

嘿那里,我有一个阿拉伯语联系脚本,它使用Ajax在填写表单后从服务器检索响应。

在某些apache服务器上,jQuery.parseJSON()会为同一个json抛出invalid json例外,它会在其他服务器上完美解析。仅在chrome和IE上抛出此异常。

json内容使用php的json_encode()函数进行编码。我尝试使用json数据发送正确的标头并将unicode设置为utf-8,但这没有帮助。

这是我尝试解析的json响应之一(删除了if的第二部分因为它很长):

{"pageTitle":"\u062e\u0637\u0623 \u0639\u0646\u062f \u0627\u0644\u0625\u0631\u0633\u0627\u0644 !"}

注意:这个数据的语言是阿拉伯语,这就是为什么它在用php的json_encode()解析后看起来像这样。

您可以尝试在给出的示例中发出请求,并使用firebug或webkit开发人员工具查看完整的响应数据。回复通过了jsonlint

最后,我有两个使用相同版本脚本的网址,尝试使用chrome或IE浏览它们以查看损坏示例中的错误。

工作示例http://namodg.com/n/

破碎的例子http://www.mt-is.co.cc/my/call-me/

已更新:为了澄清更多内容,我想请注意,我通过使用旧的eval()解析内容来修复此问题,我发布了另一个版本的此修复程序,它是这样的:

// Parse the JSON data
try
{
    // Use jquery's default parser
    data = $.parseJSON(data);
}
catch(e)
{
    /*
     * Fix a bug where strange unicode chars in the json data makes the jQuery
     * parseJSON() throw an error (only on some servers), by using the old eval() - slower though!
     */
    data = eval( "(" + data + ")" );
}

我仍然想知道这是否是jquery的parseJSON()方法中的错误,以便我可以向他们报告。

3 个答案:

答案 0 :(得分:6)

发现了问题!很难注意到,但是我看到的东西对这个开口大括号很有趣......附近似乎有几个小点它。我使用这个JavaScript书签来找出它是什么:

javascript:window.location='http://www.google.com/search?q=u+'+('000'+prompt('String?').charCodeAt(prompt('Index?')).toString(16)).slice(-4)

我得到了the results page。猜猜问题是什么!在输出的开头有一个看不见的字符,实际上重复了两次。零宽度不间断空间也称为 Unicode字节顺序标记(BOM)。这就是为什么jQuery拒绝你原本有效的JSON以及为什么将JSON粘贴到JSONLint中的原因是神秘的(取决于你是怎么做的)。

将这种不需要的字符输入输出的一种方法是使用Windows记事本以UTF-8模式保存PHP文件!如果这是您正在做的事情,请获取另一个文本编辑器,例如Notepad++。重新保存所有PHP文件而不使用BOM来解决问题。

步骤1:默认情况下,设置Notepad ++以UTF-8编码文件而不使用BOM。 UTF-8 without BOM setting in New Document tab of Preferences

步骤2:打开每个现有的PHP文件,更改“编码”设置,然后重新保存。 Encoding...Encode in UTF-8 without BOM

答案 1 :(得分:1)

您应该尝试使用json2.js(它位于https://github.com/douglascrockford/JSON-js

即使是John Resig(jQuery的创建者)也说你应该:

  

强烈建议使用此版本的JSON.js.如果您仍在使用旧版本,请升级(这个版本无疑会比前一版本更少)。

http://ejohn.org/blog/the-state-of-json/

答案 2 :(得分:0)

我没有看到任何与parseJSON()

相关的内容

我看到的唯一区别是在工作示例中设置了session-cookie(猜测它是“captcha”,数学计算所需),在另一个例子中没有设置session-cookie。因此,如果没有session-cookie,计算结果的比较可能会失败。