JSON响应中的非法字符

时间:2012-04-04 22:35:16

标签: javascript json unicode utf-8

我有一个Sencha Touch应用程序。我有一个商店使用ajax代理和json阅读器。从我的sinatra应用程序返回的JSON中的一些字符串偶尔会包含这个字符: http://www.fileformat.info/info/unicode/char/2028/index.htm

虽然它是不可见的,但字符在这里的第二个字符串中出现两次,在句点和结尾引号之间:

"description": "Each of the levels requires logic, skill, and brute force to crush the enemy.

"

尝试复制并粘贴“每个级别都需要逻辑,技能和蛮力来粉碎敌人。”进入你的javascript控制台!它不会被解析为字符串,并且会因SyntaxError: Unexpected token ILLEGAL而失败。

这会导致JSON响应失败。我已经被困在这个很长一段时间了!有什么建议吗?

3 个答案:

答案 0 :(得分:5)

解决此问题的唯一可靠方法是服务器端。确保您的JSON生成器发出转义的字符,例如为\u2028

根据我的经验,最简单的方法就是简单地用纯ASCII编码你的JSON,它总能工作。缺点是效率较低,因为非ASCII字符会占用更多空间,因此根据频率的不同,您可能不需要权衡...

Perl的JSON :: XS文档对问题有一个很好的解释,并提供了如何在Perl中修复它的建议: http://search.cpan.org/perldoc?JSON::XS#JSON_and_ECMAscript

答案 1 :(得分:0)

从概念上讲,只允许通过适当的转义从服务器发送有效JavaScript字符串的字符串。

如果您想在客户端修复此问题,则需要一个额外的解决方法步骤(仅在Firefox中有效):

var a = escape("Each of the levels requires logic, skill, and brute force to crush the enemy.");
alert(unescape(a));

但讨论已经过时,因为您必须在服务器上进行转义。

答案 2 :(得分:-2)

避免使用eval来解析JSON。

使用JSON.parsehttps://github.com/douglascrockford/JSON-js

JSON.parse('{}');  // where {} is your JSON String