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

ws51t4hk  于 2023-03-04  发布在  其他
关注(0)|答案(5)|浏览(264)

对于JavaScript对象或JSON字符串,键名称中是否有禁用字符?或者需要转义的字符?
更具体地说,我希望在键名中使用“$"、“-”和空格。

13z8s7eq

13z8s7eq1#

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

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

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

nsc4cvqm

nsc4cvqm2#

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

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

JSON Parser可以帮助您处理JSON。

vdzxcuhz

vdzxcuhz3#

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

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

xdyibdwo4#

必须避免使用Unicode代码点U+D800到U+DFFF:它们在Unicode中无效,因为它们是为UTF-16代理项对保留的。某些JSON编码器/解码器会将它们替换为U+FFFD。例如,请参见how the Go language and its JSON library deals with them
因此,避免单独使用“\uD800”到“\uDFFF”(不要使用代理对)。

goucqfw6

goucqfw65#

JSON和JavaScript都允许任意字符串作为对象属性名,这取决于它们自己的语言定义。最新的JSON语言定义文档是RFC 8259(用于JSON)和ECMA-262(用于JavaScript)。
键中需要转义的字符是语言中任何字符串中需要转义的字符。语言定义文档中也给出了这些字符。对于JSON,需要转义的字符是引号、反斜杠和控制字符。对于Javascript,需要转义的字符是与括起的引号匹配的引号字符(单或双)、反斜杠、回车和换行符。
对于您的特定示例,所有“$"、“-”和空格都可以作为JSON和JavaScript对象的键,不需要转义。

对象属性名称

根据RFC 8259,对用作对象名称的字符串值没有任何限制:
一个对象结构被表示为一对大括号,它包围着零个或多个名称/值对(或成员)。名称是一个字符串。每个名称后面有一个冒号,将名称与值分隔开。一个逗号将值与后面的名称分隔开。对象中的名称应该是唯一的。

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

   member = string name-separator value

ECMA-262明确规定所有字符串都是有效的对象属性名称:

  • 属性键 * 值是ECMAScript字符串值或符号值。所有字符串和符号值(包括空字符串)都是有效的属性键。* 属性名称 * 是字符串值属性键。

字符串转义

RFC 8259列出了JSON中必须转义的字符:
所有Unicode字符都可以放在引号内,但必须转义的字符除外:引号、反斜线和控制字符(U+0000到U+001 F)。
ECMA-262列出了JavaScript中必须转义的字符:
字符串文字是用单引号或双引号括起来的0个或多个Unicode码位。[...]除了右引号码位U+005 C(REVERSE SOLIDUS)、U+000 D(CARRIAGE RETURN)和U+000 A(LINE FEED)之外,所有码位都可以按字面意思出现在字符串文字中。
如果字符串用双引号括起来,则右引号代码点为";如果字符串用单引号括起来,则右引号代码点为'

相关问题