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