266

示例:以下代码对JSON 规范有效吗?

{
    precision: "zip"
}

还是我应该始终使用以下语法?(如果是这样,为什么?)

{
    "precision": "zip"
}

我在 JSON 规范中还没有真正找到有关此的内容。尽管他们在示例中的键周围使用引号。

4

7 回答 7

163

是的,你需要引号。这是为了使其更简单,并避免必须为 javascript 保留关键字使用另一种转义方法,即{for:"foo"}.

于 2009-06-04T09:26:03.107 回答
141

使用字符串作为键是正确的。这是 RFC 4627 的摘录- JavaScript 对象表示法 (JSON) 的 application/json 媒体类型

2.2. 对象

对象结构表示为一对围绕零个或多个名称/值对(或成员)的花括号。 名称是一个字符串。每个名称后面都有一个冒号,将名称与值分开。单个逗号将值与后面的名称分开。对象中的名称应该是唯一的。

object = begin-object [ member *( value-separator member ) ] end-object

member = string name-separator value

[...]

2.5. 字符串

字符串的表示类似于 C 系列编程语言中使用的约定。字符串以引号开头和结尾。[...]

string = quotation-mark *char quotation-mark

quotation-mark = %x22 ; "

在此处阅读整个 RFC 。

于 2009-06-04T09:28:59.577 回答
15

2.2 开始。对象

对象结构表示为一对围绕零个或多个名称/值对(或成员)的花括号。名称是一个字符串。

2.5 开始。字符串

字符串以引号开头和结尾。

所以我会说根据标准:是的,你应该总是引用密钥(尽管有些解析器可能更宽容)

于 2009-06-04T09:29:12.307 回答
7

是的,报价是强制性的。http://json.org/说:

string
    ""
    " chars "
于 2009-06-04T09:25:41.690 回答
5

是的,他们这样做。但如果您需要其他方式,请查看 JSON5

JSON5是 JSON 的超集,它允许 ES5 语法,包括:

  • 不带引号的属性键
  • 单引号、转义和多行字符串
  • 备用数字格式
  • 评论
  • 额外的空格

JSON5 参考实现(json5npm 包)提供了一个JSON5对象,该对象具有parsestringify内置JSON对象相同的参数和语义。

于 2020-05-04T19:21:07.063 回答
0

在您的情况下,它们都是有效的,这意味着它们都可以工作。

但是,您仍然应该在键名中使用带引号的那个,因为它更传统,这使得键名更加简单,并且能够使用空格等键名。

因此,请使用带引号的那个。

编辑// 检查这个:JSON 和 Object Literal Notation 有什么区别?

于 2021-10-03T07:51:50.967 回答
-3

由于您可以使用“parent.child”点分符号,而不必使用同样有效且有用的 parent["child"],我想说这两种方式在技术上都是可以接受的。解析器都应该做这两种方式都很好。如果您的解析器不需要在键上加上引号,那么最好不要放它们(节省空间)。将它们称为字符串是有意义的,因为它们就是这样,并且由于方括号使您能够使用键的值,本质上不这样做是完全合理的。在 Json 中,您可以放置​​...

>var keyName = "someKey";
>var obj = {[keyName]:"someValue"};

>obj
Object {someKey: "someValue"}

没有问题就很好,如果你需要一个键的值并且没有引用将不起作用,所以如果它不需要,你不能,所以你不会“你不需要键的引号”。即使说它们在技术上是字符串是正确的。逻辑和用法则相反。在我们从任何浏览器的控制台运行的示例中,它也不会为 obj 正式输出 Object {"someKey": "someValue"}。

于 2016-01-31T01:55:48.843 回答