【问题标题】:Javascript JSON strings with nul '\0'带有 null '\0' 的 Javascript JSON 字符串
【发布时间】:2019-01-19 23:07:25
【问题描述】:

基于属性的测试发现了很多错误。在用 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'没有问题。

最后一行让我完全困惑!

【问题讨论】:

  • "'we\u0000e'" 是一个 Javascript 字符串文字,其 NUL 字符编码为反斜杠转义... "'we\\u0000e'" 怎么样?这会解析吗?
  • 第三个示例令人困惑,无论是否支持空字符,它都不会是有效的 JSON ('foo')。此外,字符的呈现方式和它们在内存中的表示方式是两件不同的事情。您确定在上一个示例中呈现代码点的代码尚未决定将 null 呈现为空格吗?

标签: javascript json null


【解决方案1】:

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

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

产生一个包含

的字符串
"we\u0000e"

(包括"s)。此字符串不包含实际的 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")));

【讨论】:

  • 啊 '\' 需要转义。谢谢。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-16
    • 2021-09-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多