JSON密钥是否必须用引号引起来?


233

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

{
    precision: "zip"
}

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

{
    "precision": "zip"
}

我还没有在JSON规范中找到关于此的任何东西。尽管他们在示例中使用了围绕键的引号。

Answers:


145

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


12
在许多情况下,引号并不简单,例如手工编辑的配置文件。不幸的是,JSON被用作(和误用)一种几乎通用的交换格式是因为它具有特定于Javascript的功能。
miguel 2015年

12
真正的原因-检查这个答案太- stackoverflow.com/questions/4201441/...
TechMaze

3
Tl; dr:他们不想处理ECMAScript对(未加引号的)保留关键字作为键的限制,因此他们只需要引用所有键。
BallpointBen

136

您正确使用字符串作为键。这是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 。


11
并完成思想,第2.5节说:A string begins and ends with quotation marks.
rakslice

13

2.2开始。对象

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

2.5开始 弦乐

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

因此,我要根据标准说:是的,您应该始终引用密钥(尽管某些解析器可能更宽容)



0

是的,他们愿意。但是,如果您另有需要,请签出JSON5

JSON5是JSON的超集,它支持ES5语法,包括:

  • 未引用的属性键
  • 单引号,转义和多行字符串
  • 备用数字格式
  • 注释
  • 多余的空格

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


-2

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

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

>obj
Object {someKey: "someValue"}

没问题,如果您需要一个键的值而没有被引用的行将不起作用,那么它就没问题了,因此,如果没有,则不会,所以您不会这样,“您不需要键上的引号”。即使正确地说它们在技术上是字符串。逻辑和用法则相反。在我们的示例中,它也没有从任何浏览器的控制台中正式输出obj的Object {“ someKey”:“ someValue”}。


2
接受的答案和定义JSON的RFC都说引号是必需的。
基思·汤普森

的确如此,但值得一提的是逻辑上并不需要。我想所有浏览器控制台的JavaScript Object Notation输出都是错误的,我们应该告诉别人解决这个问题。也许浏览器控制台为对象输出的不是JSON,所以也许规范中不需要或在大多数地方都没有实现JSON。无论如何,我只是想提出理由,这以不同的角度来看待事实。确实,也许应该更改规格,然后,对于我个人而言,根本不需要“加引号的键”。(实际上并没有以这种方式使用它。)
Master James Master

2
您正在混合三种不同的东西:JSON,JavaScript对象文字和浏览器开发人员工具控制台输出。当您obj在控制台中键入内容时,浏览器将显示一些易于理解的对象表示形式。它可以将其显示为对象文字(如您在示例中所做的那样),也可以使用其他表示形式,甚至是交互式表示形式。如果键是有效标识符而不是保留字,则JavaScript对象文字不需要键名周围的引号。但是,JSON 始终要求在键名周围加上引号。
Michael Geary

3
作为其他示例obj,请尝试在而不是在控制台中输入JSON.stringify(obj)。现在,您将看到该对象的有效JSON表示形式,并带有引用的键名。相反,要查看字符串是否为有效的JSON,请尝试JSON.parse(string)。如果没有引号,这将引发异常。例如,JSON.parse('{"a":"b"}')将成功,但JSON.parse('{a:"b"}')将失败。
Michael Geary

1
OTOH,您的使用var obj = {[keyName]:"someValue"};非常有趣!我不知道您可以使用JavaScript对象文字来实现。一点点检查表明这是ES6中的新功能-您无法在ES5中做到这一点。
Michael Geary
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.