是否有任何实际的理由为JSON密钥使用带引号的字符串?

Mar*_*ers 82 javascript browser json double-quotes

根据Crockford的json.org,JSON 对象成员组成,成员成对组成.

每对由字符串值组成,字符串定义为:

字符串是零个或多个Unicode字符的序列,用双引号括起来,使用反斜杠转义.字符表示为单个字符串.字符串非常类似于C或Java字符串.

但实际上大多数程序员甚至不知道JSON键应该用双引号括起来,因为大多数浏览器不需要使用双引号.

用双引号打扰你的JSON是否有意义?

有效示例:

{
  "keyName" : 34
}
Run Code Online (Sandbox Code Playgroud)

与无效相反:

{
   keyName : 34
}
Run Code Online (Sandbox Code Playgroud)

CMS*_*CMS 147

关于为什么JSON键应该在引号中的真正原因依赖于ECMAScript 3的标识符的语义.

保留字不能用作没有引号的Object Literals中的属性名称,例如:

({function: 0}) // SyntaxError
({if: 0}) // SyntaxError
({true: 0}) // SyntaxError
// etc...
Run Code Online (Sandbox Code Playgroud)

如果使用引号,则属性名称有效:

({"function": 0}) // Ok
({"if": 0}) // Ok
({"true": 0}) // Ok
Run Code Online (Sandbox Code Playgroud)

自己的Crockford在本次演讲中解释了这一点,他们希望将JSON标准保持简单,并且他们不希望对它有所有这些语义限制:

....

那时我们发现了不带引号的名字问题.事实证明,ECMA Script 3有一个重击保留字策略.保留字必须在关键位置引用,这实在是令人讨厌.当我开始将其公式化为标准时,我不想将所有保留字放在标准中,因为它看起来真的很愚蠢.

当时,我试图说服人们:是的,你可以用JavaScript编写应用程序,它实际上可以工作,而且它是一种很好的语言.那时我不想说:看看他们做的这个非常愚蠢的事情!所以我决定,让我们只是引用键.
这样,我们就不必告诉任何人这是多么糟糕.

这就是为什么,直到今天,密钥都是用JSON引用的.

...

ECMAScript第5版标准对此进行了修复,现在在ES5实现中,甚至可以在没有引号的情况下使用保留字,包括对象文字和成员访问(obj.function在ES5中为Ok).

仅仅是为了记录,这个标准目前正由软件供应商实施,您可以在此兼容性表中查看哪些浏览器包含此功能(请参阅保留字作为属性名称)

  • @马克,不客气。请记住,JSON 只是一种“与语言无关”的数据交换格式,即使其语法受到 Javascript 对象文字语法的启发,它们之间也存在差异(不仅仅是引用的键)。 (2认同)
  • @CMS,那么为什么必须只是双引号呢?为什么单引号在JSON中无效? (2认同)

Nic*_*ver 16

是的,它是无效的JSON,并且在许多情况下会被拒绝,例如jQuery 1.4+有一个检查,使得不带引号的JSON无声地失败.为什么不合规?

让我们再看一个例子:

{ myKey: "value" }
{ my-Key: "value" }
{ my-Key[]: "value" }
Run Code Online (Sandbox Code Playgroud)

......所有这些是有效的引号,为什么不保持一致,并在所有情况下使用它们,消除问题的可能性?

Web开发人员世界中的一个更常见的例子:在大多数浏览器中有成千上万的无效HTML示例......这是否会减少调试或维护的痛苦?完全没有,恰恰相反.

另外@ Matthew在下面的评论中提出了最好的观点,这已经失败,不带引号的键会JSON.parse()在所有主流浏览器(以及其他正确实现它的其他浏览器)中引发语法错误,您可以在此处进行测试.