带有 nul '\0' 的 Javascript JSON 字符串

Ray*_*Ray 2 javascript null json

基于属性的测试发现了很多错误。使用 PostgreSQL 修复 bug 后,它最终表现为 JavaScript bug。这是在 Chrome 中测试的:

JSON.stringify("wee");      // "'wee'"
JSON.stringify("we\0e");    // ""we\u0000e""
JSON.parse("'we\u0000e'");  // Uncaught SyntaxError: Unexpected token in JSON at position 0
JSON.parse('"we\u0000e"');  // Uncaught SyntaxError: Unexpected token in JSON at position 3
JSON.parse("\"we\u0000e\"");  // Uncaught SyntaxError: Unexpected token in JSON at position 3
JSON.parse(JSON.stringify("we\u0000e")); // "we e" !!
Run Code Online (Sandbox Code Playgroud)

问题是 JSON 是否应该支持字符串中的 '\0'。PostgreSQL 和 C/C++ 说不。其他人说肯定。还有人说也许...

不管怎样,Chrome JS 中的 JSON.parse/stringify 之间肯定存在一些不一致。其他json解析器对'\u0000'没有问题。

我对最后一行完全感到困惑!

Cer*_*nce 5

JSON.stringify使用这样的字符串会产生带有文字反斜杠字符的字符串:

JSON.stringify("we\0e");
Run Code Online (Sandbox Code Playgroud)

结果包含一个字符串

"we\u0000e"
Run Code Online (Sandbox Code Playgroud)

(包括"s)。该字符串不包含实际的 nul 字符 - 相反,它包含一个\字符,后跟u,然后是 4 个零。

你的第一个的问题

JSON.parse("'we\u0000e'");
Run Code Online (Sandbox Code Playgroud)

JSON.parse只接受双引号字符串,而不接受单引号字符串。(JSON.parse(`'foo'`)也会抛出错误)

第二个的问题

JSON.parse('"we\u0000e"');
Run Code Online (Sandbox Code Playgroud)

是解释器首先对传递给包含实际 nul 字符的字符串进行转义JSON.parse,并且JSON.parse不理解此类字符。解析后的字符串不包含 11 个字符,只包含 6 个字符。

JSON.stringify("we\0e");
Run Code Online (Sandbox Code Playgroud)

您需要指示一个文字反斜杠,后跟u0000,才能JSON.parse正常工作:

如果您与 链接在一起JSON.parseJSON.stringify它就可以正常工作(当您不必手动转义所有内容时,事情就不那么混乱了):

JSON.parse("'we\u0000e'");
Run Code Online (Sandbox Code Playgroud)