嘿那里,我有一个阿拉伯语联系脚本,它使用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()
方法中的错误,以便我可以向他们报告。
答案 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。
步骤2:打开每个现有的PHP文件,更改“编码”设置,然后重新保存。
答案 1 :(得分:1)
您应该尝试使用json2.js(它位于https://github.com/douglascrockford/JSON-js)
即使是John Resig(jQuery的创建者)也说你应该:
强烈建议使用此版本的JSON.js.如果您仍在使用旧版本,请升级(这个版本无疑会比前一版本更少)。
答案 2 :(得分:0)
我没有看到任何与parseJSON()
相关的内容我看到的唯一区别是在工作示例中设置了session-cookie(猜测它是“captcha”,数学计算所需),在另一个例子中没有设置session-cookie。因此,如果没有session-cookie,计算结果的比较可能会失败。