例子: 下面的代码是否符合JSON规范?
{
precision: "zip"
}
还是我应该始终使用以下语法?(如果是这样,为什么?)
{
"precision": "zip"
}
我在JSON规范中没有找到关于这个的具体说明,尽管在他们的示例中使用引号包围键。
例子: 下面的代码是否符合JSON规范?
{
precision: "zip"
}
还是我应该始终使用以下语法?(如果是这样,为什么?)
{
"precision": "zip"
}
我在JSON规范中没有找到关于这个的具体说明,尽管在他们的示例中使用引号包围键。
是的,你需要引号。这是为了使其更简单,并避免需要另一种JavaScript保留关键字的转义方法,例如 {for:"foo"}
。
你正确地使用了字符串作为键。以下是取自《RFC 4627 - JavaScript对象表示法(JSON)的应用程序/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,请在这里阅读。
从2.2.对象开始
对象结构表示为一对花括号,其中包含零个或多个名称/值对(或成员)。名称是一个字符串。
以及从2.5.字符串中
字符串以引号开头和结尾。
因此,根据标准,我会说:是的,您应该始终引用键(尽管有些解析器可能更宽容)。
对于常规的JSON,是的,键必须要用引号括起来。但如果你需要其他方式,可以看看广泛使用的JSON5,它被命名为超集,因为它允许ES5语法,包括:
JSON5的参考实现(json5
npm类库)提供一个JSON5
对象,该对象具有与内置JSON
对象相同的参数和语义的parse
和stringify
方法。
JSON5成立于2012年,截至2022年,现在每周有超过65M次下载,排名npm上最常用的软件包的前0.1%,并已被主要项目如Chromium, Next.js, Babel, Retool, WebStorm等采用。 它也在Apple平台上(如MacOS和iOS)得到本地支持。
~ json5.org 网站首页
JSON
在 JSON 格式中,键必须用引号括起来。
JSON 示例:
{
"name": "John",
"age": 30
}
JSON5
JSON5 是 JSON 的超集,它在原始的 JSON 格式基础上添加了一些额外的功能,包括使用单引号或未加引号的键。
JSON5 示例:
{
// This is a comment
name: 'John',
'age': 30,
}
Hjson
Hjson 还允许键名不用加引号,只要它们不含空格或其他特殊字符。Hjson 本质上是 JSON/JSON5 的一种更为自由和宽容的版本,它允许数据格式和语法更具灵活性。
Hjson 示例:
{
// This is a comment
name: John
age: 30
city: New York
favorites: [
pizza
ice cream,
]
}
既然你可以使用“parent.child”点符号,也可以使用有效且有用的parent["child"],我认为两种方式都是技术上可接受的。解析器应该都能很好地处理这两种方式。如果您的解析器不需要键上的引号,则最好不要放置它们(节省空间)。将它们称为字符串是有道理的,因为它们就是字符串,并且由于方括号使您能够使用值作为键,因此不使用引号是完全合理的。在Json中,您可以放置...
>var keyName = "someKey";
>var obj = {[keyName]:"someValue"};
>obj
Object {someKey: "someValue"}
没有问题,如果你需要一个键的值,而没有引号不起作用,所以如果它不起作用,你就不能这样做,所以你不需要在键上加引号。即使技术上说它们是字符串,逻辑和使用也会有不同的看法。在我们的示例中,它也不会正式输出对象 {"someKey": "someValue"},在任何浏览器控制台运行。
obj
时,浏览器会显示对象的某些可读表示。它可以将其显示为对象字面量(就像在你的示例中所做的那样),或者它可能使用其他表示形式,甚至是交互式的形式。如果键名是有效的标识符且不是保留字,JavaScript 对象字面量不需要在键名周围加引号。然而,JSON 总是要求在键名周围加上引号。 - Michael Gearyobj
,而是尝试 JSON.stringify(obj)
。现在,您将看到对象的有效 JSON 表示,包括带引号的键名。相反,如果想要查看字符串是否为有效的 JSON,请尝试 JSON.parse(string)
。如果键没有用引号括起来,这将会抛出异常。例如,JSON.parse('{"a":"b"}')
将会成功,但是 JSON.parse('{a:"b"}')
将会失败。 - Michael Gearyvar obj = {[keyName]:"someValue"};
的方式非常有趣!我不知道在 JavaScript 对象字面量中可以这样做。经过一些检查,发现这是 ES6 中的新功能 - 在 ES5 中无法实现。 - Michael Geary