在JSON键中使用加引号的字符串有实际的理由吗?


87

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

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

字符串是零个或多个Unicode字符的序列,使用反斜杠转义符将其括在双引号中。字符表示为单个字符串。字符串非常类似于C或Java字符串。

但是实际上,大多数程序员甚至都不知道JSON密钥应该用双引号引起来,因为大多数浏览器不需要使用双引号。

麻烦用双引号引起来的JSON是否有意义?

有效示例:

{
  "keyName" : 34
}

相对于无效:

{
   keyName : 34
}

20
“为什么要做正确的事?” 这是一种懒惰的想法,导致网站标记无效。万一某些浏览器确实需要双引号,那么您的代码就可以面向未来。
meagar

21
“为什么要做正确的事?” -如果没有真正的好处,为什么还要遵循一个别人没有的惯例?也许您将懒惰的思维与实用主义混为一谈。
马克·罗杰斯

15
@Mark-“没有人能做到” ...你从哪儿得到这个主意的?每个主要平台中内置的JSON序列化程序都会执行正确的报价。
尼克·克雷弗

7
@Mark Rogers PHP json_encode函数生成有效的JSON,例如,带双引号的字符串。也许您正在考虑JavaScript中的对象文字?的确,那些方法不需要引号就可以工作,但这不是JSON。
日5

9
作为记录,几年前我发布此消息时,我对@JAL所建议的JSON和对象文字表示法之间的区别感到困惑。两者的语法非常相似,最终导致在描述问题时有些混乱。
马克·罗杰斯

Answers:


155

为何将JSON键放在引号中的真正原因取决于ECMAScript 3标识符的语义。

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

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

如果使用引号,则属性名称有效:

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

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

....

那就是我们发现未引用名称的问题。事实证明,ECMA Script 3具有一些保留字策略。保留字必须在关键位置加引号,这确实很麻烦。当我开始将其制定为标准时,我不想将所有保留字都放入标准中,因为它看起来确实很愚蠢。

当时,我试图说服人们:是的,您可以使用JavaScript编写应用程序,它实际上可以正常工作,并且是一种很好的语言。那么,我不想同时说:看看他们所做的这件事真是愚蠢!因此,我决定让我们只引用这些键。
那样,我们不必告诉任何人它是多么的糟糕。

这就是为什么到目前为止,键都用JSON引用。

...

现在,ECMAScript 5th Edition Standard在ES5实现中解决了此问题,即使对象字面量和成员访问权限中,甚至保留字也可以不带引号使用(obj.functionES5中为OK)。

仅作记录,该标准已由软件供应商实施,您可以在此兼容性表上查看哪些浏览器包含此功能(请参阅保留字作为属性名)。


1
@Mark,不客气。请记住,JSON只是一种与语言无关的数据交换格式,即使其语法是受Javascript Object Literal语法启发的,但它们之间也存在差异(不仅仅是带引号的键)。
Christian C.Salvadó10年

2
@CMS,那么为什么必须仅使用双引号?为什么单引号在JSON中无效?
Pacerier 2014年

1
不允许使用单引号将JSON标准保持尽可能简单。JSON只需要是Javascript的子集,就不需要实现尽可能多的Javascript。
thomasrutter

JSON5超集规格附着于ES5语法,因此支持除其他事项外不带引号键。该库具有兼容parsestringify方法。
Inigo

在该兼容性表链接中(在答案的底部),保留字条目位于“对象/数组文字扩展”部分下。而TL; DR,所有列出的浏览器(您已经听说过,还有大约20多个)都说“是”。
i336_

16

是的,它是无效的JSON,在许多情况下会被拒绝,例如jQuery 1.4+的检查使无引号的JSON静默失败。为什么不合规?

让我们再举一个例子:

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

...所有这些用引号引起来,为什么不保持一致并在所有情况下都使用它们,从而消除出现问题的可能性?

Web开发人员世界中一个更常见的示例:在大多数浏览器中都有成千上万个无效的HTML呈现示例...是否使调试或维护的痛苦减轻了?完全没有,相反。

此外,@ Matthew在下面的评论中也指出了所有问题的全部,这已经失败了,未引用的键将JSON.parse()在所有主要浏览器(以及任何其他正确实现它的浏览器)中引发语法错误,您可以在此处进行测试


是的,我有一些旧的Ajax应用程序生成schonky json服务器端,由于键名周围缺少双引号,因此升级到jquery 1.4时失败。
日,日本

您可能想补充一点,所有主要的浏览器JSON.parse也会正确拒绝它。
马修·弗拉申

我很好奇,在什么情况下JQuery 1.4会因这种类型的无效json静默失败?
马克·罗杰斯

1
@Mark-在任何情况下,它都不能正确引用或包含无效字符...基本上,它将因任何无效的JSON而失败。
尼克·克拉弗

有趣的是,这并不是我使用JQuery 1.4的经验。此外,我不认为jquery负责创建json对象,这不是浏览器的javascript解释器做什么吗?您是指Jquery json反序列化吗?
马克·罗杰斯

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.