JSON键是否必须用引号括起来?

chr*_*ngs 217 json specifications standards-compliance

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

{
    precision: "zip"
}
Run Code Online (Sandbox Code Playgroud)

或者我应该总是使用以下语法?(如果是这样,为什么?)

{
    "precision": "zip"
}
Run Code Online (Sandbox Code Playgroud)

我在JSON规范中没有真正发现这个问题.虽然他们在示例中使用了键周围的引号.

cob*_*bal 136

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

  • 在许多情况下,引号并不简单,例如手动编辑的配置文件.关于JSON被使用(和误用)作为一种几乎通用的交换格式的不幸之处在于它具有特定于Javascript的特性. (12认同)
  • 真正的原因 - 检查这个答案 - http://stackoverflow.com/questions/4201441/is-there-any-practical-reason-to-use-quoted-strings-for-json-keys (12认同)
  • Tl; dr:他们不想将(未引用的)保留关键字的ECMAScript限制作为键处理,因此他们只需要引用所有键. (3认同)

Pat*_*and 131

使用字符串作为关键是正确的.以下是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.5节说:"一个字符串以引号开头和结尾." (11认同)

Ceb*_*yre 13

2.2开始.对象

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

2.5.字符串

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

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


vas*_*vas 13

如果你使用JSON5则不然

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

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

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

广泛使用,并受到许多知名项目的依赖

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

~ json5.org主页

  • 哇拯救了我的一天...我在这个废话上花费的时间..和 JSON5 解析解决了它 (4认同)

小智 7

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

string
    ""
    " chars "
Run Code Online (Sandbox Code Playgroud)