哪些字符在JSON键名中有效/无效

Which characters are valid/invalid in a JSON key name?

本文关键字:有效 无效 字符 JSON      更新时间:2023-09-26

对于JavaScript对象或JSON字符串,键名中是否有任何禁止字符?或者需要转义的字符?

更具体地说,我想在键名中使用"$","-"和空格

No。任何有效的字符串都是有效的键。它甚至可以有",只要你转义它:

{"The '"meaning'" of life":42}

您可能会在将这些值加载到某些语言时遇到困难,因为这些语言试图将键与对象字段名关联起来。然而,我不知道有这样的情况。

以下字符必须在JSON数据中转义以避免任何问题:

  • "(双引号)
  • '(斜杠)
  • 所有控制字符如'n, 't

JSON Parser可以帮助你处理JSON

值得一提的是,虽然用数字开始键是有效的,但它可能会导致一些意想不到的问题。

的例子:

var testObject = {
    "1tile": "test value"
};
console.log(testObject.1tile); // fails, invalid syntax
console.log(testObject["1tile"]; // workaround

Unicode码点U+D800到U+DFFF必须避免:它们在Unicode中无效,因为它们是为UTF-16代理对保留的。一些JSON编码器/解码器将用U+FFFD代替它们。请看Go语言和它的JSON库如何处理它们的例子。

因此,避免只使用"'uD800"到"'uDFFF"(而不是在代理符对中)。

JSON和JavaScript都允许任意字符串作为对象属性名,根据它们自己的语言定义。最新的JSON语言定义文档是JSON的RFC 8259和JavaScript的ECMA-262。

键中需要转义的字符是在该语言的任何字符串中需要转义的字符。这些也在语言定义文档中给出。对于JSON,需要转义的字符是引号、反斜杠和控制字符。对于Javascript,需要转义的字符是与括引号(单引号或双引号)匹配的引号字符、反斜杠、回车符和换行符。

对于您的特定示例,所有"$", "-"和空格都可以作为JSON &JavaScript对象,不需要转义。

对象属性名

根据RFC 8259,对用作JSON对象名称的字符串的值没有限制:

对象结构用一对花括号表示包含零个或多个名称/值对(或成员)。名字就是字符串。每个名称后面都有一个冒号,用来分隔名称从值。一个值与后面的值之间用一个逗号分隔名字对象内的名称必须是唯一的。

   object = begin-object [ member *( value-separator member ) ]
            end-object
   member = string name-separator value

关于JavaScript, ECMA-262明确声明所有字符串都是有效的对象属性名:

属性键值要么是ECMAScript String值,要么是Symbol值。所有字符串和符号值,包括空字符串,都可以作为属性键有效。属性名是一个String值的属性键。

字符串转义

RFC 8259列出了JSON中必须转义的字符:

所有Unicode字符都可以放在引号,必须转义的字符除外:引号,反向立体线,以及控制字符(U+0000)通过U + 001 f)。

ECMA-262列出了JavaScript中必须转义的字符:

字符串字面值是用单引号或双引号括起来的0个或多个Unicode码点。[…]所有代码点都可以出现在字符串字面量中,除了结束引号代码点,U+005C (REVERSE SOLIDUS), U+000D(回车)和U+000A(换行)。

如果字符串用双引号括起来,则结束引号代码点为",如果字符串用单引号括起来,则结束引号代码点为'