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

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

对象结构被表示为围绕零个或多个名称/值对(或成员)的一对大括号。 名称是一个string。

后来,规范说,一个string被引号包围。

为什么?

从而,

{"Property1":"Value1","Property2":18} 

并不是

 {Property1:"Value1",Property2:18} 

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


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

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

JSON的devise理念是“保持简单”

“用" “引用名字”你可以引用名字"或”你可以引用名字要简单得多“,但是除非它们包含某些字符(或将使其成为关键字的字符组合)和'"需要根据你select的分隔符来引用“

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

在JavaScript中它们是相同的。

我从Douglas Crockford(JSON标准的创build者)给雅虎的介绍留言。

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

那是当我们发现没有引号的名字问题。 事实certificate,ECMA脚本3有一个重击保留字策略。 保留字必须在关键位置引用,这真是一个滋扰。 当我把这个标准化时,我不想把所有的保留字都放在标准中,因为它看起来很愚蠢。

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

这就是为什么到今天为止,密钥在JSON中引用。

你可以在这里find完整的video和成绩单。

这两个:标识符都允许使用空格。 如果没有引号,当试图确定标识符到底是什么时,这会引起歧义。

在javascript对象中可以像使用密钥对的散列表/散列表一样使用。

然而,如果你的密钥有字符,JavaScript不能标记为一个名字,当它尝试访问像一个对象的属性而不是一个关键时会失败。

 var test = {}; test["key"] = 1; test["#my-div"] = "<div> stuff </div>"; // test = { "key": 1, "#my-div": "<div> stuff </div>" }; console.log(test.key); // should be 1 console.log(test["key"]); // should be 1 console.log(test["#my-div"]); // should be "<div> stuff </div>"; console.log(test.#my-div); // would not work. 

标识符有时可能具有不能在javascript中作为标记/标识符进行评估的字符,因此最好将所有标识符放在string中以保持一致性。

我认为对Cheeso的问题的正确答案是实施超过了文件。 它不再需要一个string作为关键字,而是另外的东西,它可以是一个string(即引号)或(可能)任何可以用作variables名称的东西,我猜测的意思是以字母开头, ,或$,只包括字母,数字和$和_。

我想用下面这个问题来简化剩下的问题。 这是肉:

当用作对象键时,variables名不能用JSON插值 (谢谢Friedo!)

布列塔尼用“标识符”而不是“钥匙”写道:“如果一个标识符碰巧是一个保留字,它就被解释为该字,而不是一个标识符。 这可能是真的,但我没有任何麻烦,

 var a = {do:1,long:2,super:3,abstract:4,var:5,break:6,boolean:7}; a.break 

=> 6

关于使用引号,Quentin写道:“但你不必,除非[键]包含某些字符 (或组合的字符,使它成为关键字)”

我发现前一部分(某些字符)是真的,使用@符号(实际上,我认为$和_是唯一不会导致错误的字符):

 var a = {a@b:1}; 

=>语法错误

 var a = {"a@b":1}; a['a@b'] 

=> 1

但是正如我上面所显示的那样,关键字的括号内容是不正确的。

我想要的作品是因为开头{和冒号之间,或者后面的属性的逗号和冒号之间的文本被用作一个不带引号的string来创build一个对象键,或者像Friedo所说的那样, t插入:

 var uid = getUID(); var token = getToken(); // Returns ABC123 var data = {uid:uid,token:token}; data.token 

=> ABC123

如果json描述对象,那么在实践中你会得到以下结果

 var foo = {}; var bar = 1; foo["bar"] = "hello"; foo[bar] = "goodbye"; 

那么,

 foo.bar == "hello"; foo[1] == "goodbye" // in setting it used the value of var bar 

所以即使你的例子产生了相同的结果,它们在“原始代码”中的等价物也不会。 也许这就是为什么? 不知道,只是一个想法。