是否有任何实际的理由使用带引号的字符串作为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?