【问题标题】:JSON.parse without escaping [duplicate]JSON.parse 不转义[重复]
【发布时间】:2016-09-01 20:52:34
【问题描述】:

有没有办法在 JavaScript 中做到这一点:

$ cat test.json 
{"body":"\u0000"}

$ python3 -c 'import json; print(json.load(open("test.json", "r")))'
{'body': '\x00'}

注意,上面的数据只有一个\(不需要转义)。所以你在 JavaScript 中有如下情况:

JSON.parse('{"body":"\\u0000"}') // works
JSON.parse('{"body":"\u0000"}') // does not work

对于可能来自二进制源 (websocket) 的任何 UTF-8 数据,是否可以像上面第一个 python 示例中那样直接处理这些数据?

【问题讨论】:

  • 在 Javascript 中,就像在 Python 中一样,\ 在定义字符串时具有特殊含义。您必须将其加倍为\\ 才能删除比特殊含义。 产生的字符串值实际上只有一个反斜杠,后跟字符u,等等。
  • test.json 文件中,您没有定义 Python 或 Javascript 字符串文字,所以不,那里没有双反斜杠。
  • 在 ECMAscript 6 中,有一个 String.raw syntax 可以满足您的需求:JSON.parse(String.raw`{"body":"\u0000"}`)
  • 最后但同样重要的是,来自 websocket 的数据是数据而不是字符串文字,因此不会转义反斜杠。

标签: javascript python json


【解决方案1】:

\u0000\u001F 的字符串字符被视为控制字符,根据RFC-7159,不允许在JSON 中使用字符,必须进行转义,如in section 7 所述。

您要做的是将未转义的控制字符放入 JSON 中,这显然是不可接受的,您必须先对其进行转义,没有语言接受它,甚至 Python。

正确的答案是将 UTF-8 编码值放入包含 JSON 格式的字符串中。

这是一个正确的 JSON,可以被任何语言的任何 JSON 解析器解析,即使是 JavaScript:

{"body":"\u0000"}

这是不正确 JSON(将 [NUL] 视为 NUL 控制字符,因为它不能在文本中表示):

{"body":"[NUL]"}

这就是JSON.parse('{"body":"\\u0000"}') 有效而JSON.parse('{"body":"\u0000"}') 无效的原因。

希望,它可以澄清你的测试出了什么问题。

【讨论】:

  • 这并没有告诉 OP 如何在 JavaScript 字符串中指定 \u0000 转义序列。
  • 抱歉,您必须使用 RTFM!
  • 我已经很好地阅读了 RFC,谢谢。你问错了问题。
  • 我会澄清我的答案。
  • 再次,这是关于字符串文字与字符串值的混淆。 OP 没有尝试插入文字 NUL 值。
猜你喜欢
  • 2020-02-04
  • 1970-01-01
  • 2014-12-12
  • 2018-03-10
  • 2015-04-22
  • 2018-05-20
  • 2011-09-14
  • 1970-01-01
  • 2014-03-29
相关资源
最近更新 更多