为什么在Node.js中JSON.parse无法处理编码字符?

3

我正在尝试在谷歌字典半-API中查找“flower”一词。来源:

https://gist.github.com/DelvarWorld/0a83a42abbc1297a6687

长话短说,我正在使用带有回调参数的JSONP,然后通过正则表达式进行提取。
但是遇到了这个问题:
undefined:1
ple","terms":[{"type":"text","text":"I stopped to buy Bridget some \x3cem\x3ef
                                                                    ^
SyntaxError: Unexpected token x
    at Object.parse (native)

谷歌向我提供了转义的HTML字符,这很好,但是JSON.parse无法处理它们??让我感到奇怪的是这个可以正常工作:

$ node

> JSON.parse( '{"a":"\x3cem"}' )
  { a: '<em' }

我不明白为什么我的应用程序会崩溃。 编辑 这些都是很好的信息性回复,但都没有帮助我解决堆栈跟踪问题。

请查看http://json.org/中的字符串。 - Paul
4个回答

2

\xHH 不是 JSON 的一部分,但是是 JavaScript 的一部分。它相当于 \u00HH。由于内置的 JSON 似乎不支持它,而且我怀疑您不想费心修改非内置的 JSON 实现,因此您可能只想在沙盒中运行代码并收集结果对象。


如果您需要解析“几乎JSON”结构的另一个技巧是在解析之前将\x替换为\u00。这样稍微更安全一些,因为它避免了eval的使用。 - bobince
@bobince:没错,这就是为什么我包含了“\xHH\u00HH”这一部分的原因。但问题在于你必须小心其他转义字符,例如不要将 \\xHH(代表文本 \xHH)改成 \\u00HH(代表文本 \u00HH)。我也同意通常情况下应该避免使用 eval,但如果你在一个沙盒环境中进行操作,并且没有访问权限……几乎没有任何东西,而且还设置了超时时间,那么它应该是安全的。 - icktoofay

0

0
根据http://json.org,JSON字符串表示中的字符串字符可以是以下内容之一:
  • 除了“-”、“\”或控制字符以外的任何Unicode字符
  • \"
  • \
  • \/
  • \b
  • \f
  • \n
  • \r
  • \t
  • \u四个十六进制数字

因此,根据该列表,您收到的“json”在\x3处格式不正确。


0
它能够工作的原因是因为这两个是等价的。
JSON.parse( '{"a":"\x3cem"}' )

并且

JSON.parse( '{"a":"<em"}' )

你的字符串已经被解码,因为它是一个字面量,传递给了JSON.parse函数。 \x3cem实际上是<em

现在,在JavaScript中\xxx是有效的,但在JSON中不是。根据http://json.org/,在\之后唯一允许的字符是"\/bfnrtu


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