在JSON中,为什么引用每个名字?

Che*_*eso 90 javascript json

JSON规范说JSON是一个对象或数组.在物体的情况下,

对象结构表示为围绕零个或多个名称/值对(或成员)的一对花括号. 名称是一个字符串. ...

后来,规范说一个字符串被引号括起来.

为什么?

从而,

{"Property1":"Value1","Property2":18}
Run Code Online (Sandbox Code Playgroud)

并不是

{Property1:"Value1",Property2:18}
Run Code Online (Sandbox Code Playgroud)

问题1:为什么不允许名称/值对中的名称是不带引号的标识符?


问题2:在Javascript中评估时,上述两种表示之间是否存在语义差异?

CMS*_*CMS 133

我从Douglas Crockford(JSON标准的创建者)给雅虎的演讲中引用了一句话.

他谈到了他如何发现 JSON,以及为什么他决定使用引用键:

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

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

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

您可以在此处找到完整的视频和成绩单.

  • @Sorin:不要将JSON与JavaScript Object文字混淆.JSON是一种与语言无关的数据交换格式,由Crockford于2006年提出(http://tools.ietf.org/html/rfc4627),其语法与JavaScript Object文字不同(http://bclary.com/2004/ 11/07 /#a-11.1.5),基本上只允许*string*键和值*MUST*是*object*,*array*,*number*,*string*或下列文字之一names:*false*,*null**true*.JavaScript中的对象文字可以包含*Identifiers*,*String literals*或*Number literals*,并且值可以是任何类型的*expression*... (41认同)

Que*_*tin 56

问题1:为什么不允许名称/值对中的名称是不带引号的标识符?

JSON的设计理念是"保持简单"

"有报价的名字""是一个简单了很多比"你可能引述其名称"',但你不必,除非它们包含某些字符(或字符,将使其成为一个关键词的组合),并'"可能需要根据被引用在你选择的分隔符上".

问题2:在Javascript中评估时,上述两种表示之间是否存在语义差异?

不.在JavaScript中它们是相同的.

  • 不,这不正确.CMS有正确的答案.这个答案只是真正原因的一个很好的副作用.除了更容易解释之外,编写解析器也更简单,因为您可以在标识符上重用字符串的解析规则. (3认同)
  • 在CMS的答案上+1,这是正确的.双引号不是代码约定,但您希望避免将保留字作为对象中的键.例如:{property1:"abc",this:"def"}为WRONG(这是保留关键字) (2认同)