JSON.parse没有转义

时间:2016-09-01 20:52:35

标签: javascript python json

无论如何都要在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示例一样直接处理?

1 个答案:

答案 0 :(得分:0)

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

你要做的是将未转义的控制字符放入JSON中,这显然是不可接受的,你必须首先逃避它,非语言接受它,甚至Python。

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

这是一个正确的JSON,将由任何语言的任何JSON解析器解析,即使在JavaScript中也是如此:

{"body":"\u0000"}

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

{"body":"[NUL]"}

这就是为什么JSON.parse('{"body":"\\u0000"}')有效而JSON.parse('{"body":"\u0000"}')无效。

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