基于属性的测试,发现了许多错误。修复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'没问题。
我对最后一行完全感到困惑!
答案 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.parse
与JSON.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" );