根据Crockford的json.org的说法,一个JSON 对象 由 成员 组成, 成员 由 对组成 。
每对都是由一个 字符串 和一个 值组成 ,其中一个 字符串 定义为:
字符串是零个或多个Unicode字符的序列,使用反斜杠转义符将其括在双引号中。字符表示为单个字符串。字符串非常类似于C或Java字符串。
但是实际上,大多数程序员甚至都不知道JSON密钥应该用双引号引起来,因为大多数浏览器不需要使用双引号。
麻烦用双引号引起来的JSON是否有意义?
有效示例:
{ "keyName" : 34 }
与无效相对:
{ keyName : 34 }
为何将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引用。 …
....
那是我们发现未引用名称的问题。事实证明,ECMA Script 3具有一些保留字策略。保留字必须在关键位置加引号,这确实很麻烦。当我开始将其制定为标准时,我不想将所有保留字都放入标准中,因为它看起来确实很愚蠢。
当时,我试图说服人们:是的,您可以使用JavaScript编写应用程序,它实际上可以正常工作,并且是一种很好的语言。那么,我不想同时说:看看他们所做的这件事真是愚蠢!因此,我决定让我们只引用这些键。 这样,我们就不必告诉任何人它的重制了。
这就是为什么到目前为止,键都用JSON引用。
…
现在,ECMAScript 5th Edition Standard在ES5实现中解决了此问题,即使对象字面量和成员访问权限中,甚至保留字也可以不带引号使用(obj.function在ES5中是确定的)。
obj.function
仅作记录,该标准已由软件供应商实施,您可以在此兼容性表上查看哪些浏览器包含此功能(请参阅 保留字作为属性名 )。