JSON 键必须用引号括起来吗?

问题描述 投票:0回答:8

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

{
    precision: "zip"
}

或者我应该始终使用以下语法吗? (如果是,为什么?)

{
    "precision": "zip"
}

我还没有真正在 JSON 规范中找到关于这个的东西。尽管他们在示例中使用引号将键括起来。

json specifications standards-compliance json5
8个回答
174
投票

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

{for:"foo"}
.


143
投票

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


16
投票

2.2。对象

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

2.5开始。弦乐

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

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


9
投票

是的,引号是强制性的。 http://json.org/ 说:

string
    ""
    " chars "

9
投票

如果你使用 JSON5

则不会

对于常规 JSON,是的,必须引用键。但是,如果您需要其他方式,请查看广泛使用的 JSON5,之所以这样命名是因为它是允许 ES5 语法的 JSON 的超集,包括:

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

JSON5 参考实现(

json5
npm 包)提供了一个
JSON5
对象,该对象具有
parse
stringify
方法,其参数和语义与内置
JSON
对象相同。

被广泛使用,并被许多知名项目所依赖

JSON5 始于 2012 年,截至 2022 年,现在每周下载量超过 6500 万,在 npm 上最依赖的软件包中排名前 0.1%,并已被 Chromium、Next.js 等主要项目采用, Babel、Retool、WebStorm 等。 MacOS 和 iOS 等 Apple 平台也原生支持它。

~ json5.org 主页


0
投票

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

但是,您仍然应该在键名中使用带引号的那个,因为它更 conventional,这会导致更简单并且能够让键名带有空格等

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

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


0
投票

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,
  ]
}

-4
投票

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

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

>obj
Object {someKey: "someValue"}

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

© www.soinside.com 2019 - 2024. All rights reserved.