是否有任何实际的理由使用带引号的string的JSON键?

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

每一对都由一个string和一个值组成string被定义为:

string是一个零个或多个Unicode字符的序列,用双引号括起来,使用反斜杠转义符。 一个字符被表示为一个string。 一个string非常像C或Javastring。

但实际上大多数程序员甚至不知道JSON键应该被双引号包围,因为大多数浏览器不需要使用双引号。

麻烦您的JSON用双引号打扰吗?

有效的例子:

{ "keyName" : 34 } 

相对于无效的:

 { keyName : 34 } 

关于为什么JSON键应该引用的真正原因,依赖于ECMAScript 3标识符的语义。

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

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

而如果您使用引号属性名称是有效的:

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

自己的克罗克福德在这个演讲中解释说 ,他们想要保持简单的JSON标准,他们不希望对它有所有这些语义限制:

….

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

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

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

ECMAScript第5版标准修正了这一点,现在在ES5实现中,甚至保留字也可以在引号和对象文字和成员访问中使用( obj.function在ES5中为OK)。

为了纪录,这个标准最近正在由软件供应商实现,你可以看到这个兼容性表中包含了这个特性的浏览器(见保留字作为属性名

是的,这是无效的JSON,并会在很多情况下被拒绝,例如jQuery 1.4+有一个检查,使无引号的JSON静静地失败。 为什么符合?

再举一个例子:

 { myKey: "value" } { my-Key: "value" } { my-Key[]: "value" } 

…所有这些都是有效的报价,为什么不一致,并在所有情况下使用它们,消除了一个问题的可能性?

在Web开发人员的世界中,有一个更常见的例子:在大多数浏览器中有成千上万的无效HTML例子,这使得debugging或维护的痛苦减轻了吗? 完全不是,完全相反。

另外@ 马修在下面的评论中说得最好,这已经失败了,没有引号的键会在所有主stream浏览器(以及任何其他正确实现它的浏览器JSON.parse()中抛出JSON.parse()的语法错误, 你可以在这里testing它 。

YAML实际上是JSON的超集,支持你想要做的事情。 尽pipe它是一个超集,但它可以让你保持简单,只要你想。

YAML是一种新鲜的空气,可能值得您花些时间来看看。 最好的地方在这里: http : //en.wikipedia.org/wiki/YAML

太阳下​​的每种语言都有libs,包括JS,例如https://github.com/nodeca/js-yaml