一尘不染

在JSON键中使用加引号的字符串有实际的理由吗?

json

根据Crockford的json.org说法,一个JSON
对象成员 组成, 成员对组成

每对都是由一个 字符串 和一个 值组成 ,其中一个 字符串 定义为:

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

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

麻烦用双引号引起来的JSON是否有意义?

有效示例:

{
  "keyName" : 34
}

与无效相对:

{
   keyName : 34
}

阅读 251

收藏
2020-07-27

共1个答案

一尘不染

为何将JSON键放在引号中的真正原因取决于ECMAScript 3标识符的语义。

不带引号的保留字不能用作对象文字中的
属性名称 ,例如:

({function: 0}) // SyntaxError
({if: 0}) // SyntaxError
({true: 0}) // SyntaxError
// etc...

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

({"function": 0}) // Ok
({"if": 0}) // Ok
({"true": 0}) // Ok

自己的Crockford在本次演讲对此进行了解释,他们希望保持JSON标准的简单性,并且不希望对其具有所有这些语义限制:

....

那是我们发现未引用名称的问题。事实证明,ECMA Script
3具有一些保留字策略。保留字必须在关键位置加引号,这确实很麻烦。当我开始将其制定为标准时,我不想将所有保留字都放入标准中,因为它看起来确实很愚蠢。

当时,我试图说服人们:是的,您可以使用JavaScript编写应用程序,它实际上可以正常工作,并且是一种很好的语言。那么,我不想同时说:看看他们所做的这件事真是愚蠢!因此,我决定让我们只引用这些键。
这样,我们就不必告诉任何人它的重制了。

这就是为什么到目前为止,键都用JSON引用。

现在,ECMAScript 5th Edition
Standard在ES5实现中解决了此问题,即使对象字面量和成员访问权限中,甚至保留字也可以不带引号使用(obj.function在ES5中是确定的)。

仅作记录,该标准已由软件供应商实施,您可以在此兼容性表上查看哪些浏览器包含此功能(请参阅 保留字作为属性名 )。

2020-07-27