nul'\ 0'

时间:2019-01-19 23:07:25

标签: javascript json null

基于属性的测试,发现了许多错误。修复PostgreSQL中的错误后,它最终表现为JavaScript错误。这已在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" !!

问题是JSON是否应在字符串中支持'\ 0'。 PostgreSQL&C / C ++拒绝。其他人说肯定。还有人说也许...

无论哪种方式,Chrome JS中的JSON.parse / stringify之间肯定存在一些不一致之处。其他json解析器的'\ u0000'没问题。

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

2 个答案:

答案 0 :(得分:4)

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

JSON.stringify("we\0e");

导致包含的字符串

"we\u0000e"

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

第一个问题

JSON.parse("'we\u0000e'");

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

第二个问题

JSON.parse('"we\u0000e"');

是解释器首先将传递给JSON.parse的字符串转义为包含实际nul字符的字符串,而JSON.parse不理解此类字符。解析的字符串不包含11个字符,仅包含6个字符。

console.log('"we\u0000e"');
console.log('"we\u0000e"'.length);

您需要输入一个反斜杠,后跟u0000,以使JSON.parse正常工作:

console.log('"we\\u0000e"'.length);
console.log(JSON.parse('"we\\u0000e"'));

如果将JSON.parseJSON.stringify链接在一起,则效果很好(当您不必手动转义所有内容时,事情就不会那么混乱了):

console.log(JSON.stringify("we\0e"));
console.log(JSON.parse(JSON.stringify("we\0e")));

答案 1 :(得分:3)

JSON不能包含NUL字符,但可以包含转义序列\u0000来表示NUL字符。在JavaScript中,它表示为'\\u0000''\u0000'只是一个长度为1的字符串;一个NUL字符)。

console.log( JSON.parse('"we\\u0000e"') === "we\0e" );