15

我有一个 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 响应失败。我已经卡在这个问题上很长时间了!有什么建议么?

4

3 回答 3

6

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

以我的经验,最简单的方法是简单地用纯 ASCII 编码你的 JSON,这将始终有效。缺点是它的效率较低,因为非 ASCII 字符会占用更多空间,因此根据这些字符的频率,您可能不希望这种权衡...

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

于 2012-05-03T01:15:14.767 回答
0

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

如果你想在客户端解决这个问题,你需要一个额外的解决步骤(似乎只在 Firefox 中有效):

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

但是讨论已经过时了,因为你必须在服务器上逃跑。

于 2012-04-16T11:35:38.220 回答
-3

避免使用eval解析 JSON。

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

JSON.parse('{}');  // where {} is your JSON String
于 2012-05-03T02:30:16.413 回答