93

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

每对由一个string和一个value组成,其中一个string被定义为:

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

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

用双引号将 JSON 括起来有什么意义吗?

有效示例:

{
  "keyName" : 34
}

与无效相反:

{
   keyName : 34
}
4

4 回答 4

161

为什么 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 第 5 版标准修复了这个问题,现在在 ES5 实现中,即使是保留字也可以在不带引号的情况下使用,对象文字和成员访问(obj.function在 ES5 中为 Ok)。

只是为了记录,这个标准现在由软件供应商实施,你可以在这个兼容性表上看到哪些浏览器包含这个特性(参见保留字作为属性名称

于 2010-11-17T04:54:13.173 回答
17

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

让我们再举一个例子:

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

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

Web 开发人员世界中更常见的一个示例:在大多数浏览器中呈现的无效 HTML 示例数以千计……这是否使调试或维护变得不那么痛苦?完全不是,恰恰相反。

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

于 2010-11-17T04:18:11.943 回答
0

如果我正确理解标准,那么 JSON 所称的“对象”实际上更接近于地图(“字典”),而不是通常意义上的实际对象。当前标准很容易适应允许任何类型的键的扩展,使

{
    "1" : 31.0,
      1 : 17,
     1n : "valueForBigInt1"
}

3 个不同元素的有效“对象/地图”。

如果不是因为这个原因,我相信设计者会为所有情况(可能除了关键字)在键周围加上引号。

于 2021-10-25T19:48:07.473 回答
-4

YAML 实际上是 JSON 的超集,支持您想要做的事情。虽然它是一个超集,但它可以让您尽可能简单。

YAML 是一股清新的空气,可能值得你花时间看看。最佳起点在这里:http ://en.wikipedia.org/wiki/YAML

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

于 2013-08-26T00:52:58.480 回答