例子: 以下代码对 JSON 规范有效吗?
{
precision: "zip"
}
或者我应该始终使用以下语法吗? (如果是,为什么?)
{
"precision": "zip"
}
我还没有真正在 JSON 规范中找到关于这个的东西。尽管他们在示例中使用引号将键括起来。
是的,你需要引号。这是为了使其更简单,并避免必须为 javascript 保留关键字使用另一种转义方法,即
{for:"foo"}
.
你使用字符串作为键是正确的。这是 RFC 4627 的摘录 - The application/json Media Type for JavaScript Object Notation (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 here.
从2.2。对象
对象结构表示为一对花括号,围绕着零个或多个名称/值对(或成员)。名称是一个字符串。
从2.5开始。弦乐
字符串以引号开头和结尾。
所以我会说根据标准:是的,你应该总是引用密钥(尽管有些解析器可能更宽容)
是的,引号是强制性的。 http://json.org/ 说:
string
""
" chars "
对于常规 JSON,是的,必须引用键。但是,如果您需要其他方式,请查看广泛使用的 JSON5,之所以这样命名是因为它是允许 ES5 语法的 JSON 的超集,包括:
json5
npm 包)提供了一个 JSON5
对象,该对象具有 parse
和 stringify
方法,其参数和语义与内置 JSON
对象相同。
JSON5 始于 2012 年,截至 2022 年,现在每周下载量超过 6500 万,在 npm 上最依赖的软件包中排名前 0.1%,并已被 Chromium、Next.js 等主要项目采用, Babel、Retool、WebStorm 等。 MacOS 和 iOS 等 Apple 平台也原生支持它。
~ json5.org 主页
在您的情况下,它们都是有效的,这意味着它们都可以工作。
但是,您仍然应该在键名中使用带引号的那个,因为它更 conventional,这会导致更简单并且能够让键名带有空格等
因此,请使用带引号的那个。
edit// 检查这个:JSON 和 Object Literal Notation 有什么区别?
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"}
没问题就好了,如果你需要一个键的值,而没有引用是行不通的,所以如果没有,你就不能,所以你不会,所以“你不需要键上的引号” .即使说它们在技术上是字符串是正确的。逻辑和用法则相反。在我们从任何浏览器的控制台运行的示例中,它也不会正式输出 Object {"someKey": "someValue"} for obj。