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

IT技术 javascript json browser double-quotes
2021-03-07 07:28:15

根据 Crockford 的json.org,JSON对象members 组成,而memberspair 组成

每对由一个字符串和一个值组成字符串定义为:

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

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

用双引号将 JSON 括起来是否有意义?

有效示例:

{
  "keyName" : 34
}

与无效相反:

{
   keyName : 34
}
4个回答

为什么 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)。

只是为了记录,这个标准最近由软件供应商实施,您可以在此兼容性表上看到哪些浏览器包含此功能(请参阅保留字作为属性名称

JSON5超集规格附着于ES5语法,因此支持除其他事项外不带引号键。该库具有兼容parsestringify方法。
2021-04-15 07:28:15
在该兼容性表链接(在答案的底部)中,保留字条目位于对象/数组文字扩展部分下。和 TL;DR,所有列出的浏览器(所有你听说过的和大约 20 多个)都说“是”。
2021-04-16 07:28:15
@Mark,不客气。请记住,JSON 只是一种与语言无关的数据交换格式,即使其语法受到 Javascript Object Literal 语法的启发,它们之间也存在差异(不仅仅是引用的键)。
2021-04-23 07:28:15
@CMS,那为什么只能是双引号呢?为什么单引号在 JSON 中无效?
2021-05-02 07:28:15
为了使 JSON 标准尽可能简单,不允许使用单引号。JSON 只需要是 Javascript 的一个子集,它不需要尽可能多地实现 Javascript。
2021-05-03 07:28:15

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

让我们再举一个例子:

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

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

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

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

@Mark - 在任何情况下,它都没有正确引用或包含无效字符......基本上它会因任何无效的 JSON 而失败。
2021-04-22 07:28:15
是的,我有一些旧的 ajax 应用程序生成了 schonky json 服务器端,但在升级到 jquery 1.4 时失败了,因为键名周围没有双引号。
2021-04-24 07:28:15
您可能想补充一点,所有主要浏览器JSON.parse也将正确拒绝它。
2021-04-28 07:28:15
我很好奇,在什么情况下,JQuery 1.4 究竟会因这种类型的无效 json 静默失败?
2021-05-08 07:28:15
这很有趣,这不是我使用 JQuery 1.4 的经验。此外,我不认为 jquery 负责创建 json 对象,这不是浏览器的 javascript 解释器所做的吗?你指的是Jquery json反序列化吗?
2021-05-13 07:28:15

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

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

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

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

YAML 实际上是 JSON 的超集,支持您想要做的事情。尽管它是一个超集,但它可以让您随心所欲地保持简单。

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

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

YAML 不是 JSON 的超集。
2021-04-21 07:28:15
2021-04-21 07:28:15