Javascript JSON 字符串与 nul ''



基于属性的测试发现了很多错误。在修复了PostgreSQL的一个错误后,它最终表现为一个JavaScript错误。这在Chrome:中进行了测试

JSON.stringify("wee");      // "'wee'"
JSON.stringify("wee");    // ""weu0000e""
JSON.parse("'weu0000e'");  // Uncaught SyntaxError: Unexpected token in JSON at position 0
JSON.parse('"weu0000e"');  // Uncaught SyntaxError: Unexpected token in JSON at position 3
JSON.parse(""weu0000e"");  // Uncaught SyntaxError: Unexpected token in JSON at position 3
JSON.parse(JSON.stringify("weu0000e")); // "we e" !!

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

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

我完全被最后一句话难住了!

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

JSON.stringify("wee");

导致包含的字符串

"weu0000e"

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

第一个的问题

JSON.parse("'weu0000e'");

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

第二个的问题

JSON.parse('"weu0000e"');

解释器首先将传递给JSON.parse的字符串反转义为包含实际nul字符的字符串,而JSON.parse不理解这些字符。解析后的字符串不包含11个字符,只包含6个字符。

console.log('"weu0000e"');
console.log('"weu0000e"'.length);

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

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

如果你把JSON.parseJSON.stringify链接在一起,它会很好地工作(当你不必手动逃离所有内容时,事情就不那么令人困惑了):

console.log(JSON.stringify("wee"));
console.log(JSON.parse(JSON.stringify("wee")));

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

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

相关内容

  • 没有找到相关文章

最新更新