是否有任何实际的理由使用带引号的字符串作为JSON密钥?

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

每一对都由一个字符串和一个值组成,其中一个字符串被定义为:

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

但实际上大多数程序员甚至不知道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

自己的Crockford在本次演讲中解释了这一点,他们希望保持JSON标准的简单性,并且他们不希望对它有所有这些语义限制:

....

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

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

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

...

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

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


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

我们再举一个例子:

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

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

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

此外@Matthew在下面的评论中提供了所有最好的观点,这已经失败了,未加引号的键将在所有主流浏览器(以及任何其他正确实现它的浏览器JSON.parse()中引发JSON.parse()语法错误,您可以在此处进行测试。


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

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

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

链接地址: http://www.djcxy.com/p/6451.html

上一篇: Is there any practical reason to use quoted strings for JSON keys?

下一篇: Deserialize JSON into C# dynamic object?