【问题标题】:Do the JSON keys have to be surrounded by quotes?JSON键是否必须用引号括起来?
【发布时间】:2018-02-26 23:56:03
【问题描述】:

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

{
    precision: "zip"
}

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

{
    "precision": "zip"
}

我在 JSON 规范中并没有真正找到这方面的内容。尽管他们在示例中使用引号将其键括起来。

【问题讨论】:

    标签: json specifications standards-compliance json5


    【解决方案1】:

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

    【讨论】:

    • 引号在很多情况下并不简单,比如手动编辑的配置文件。 JSON 作为一种几乎通用的交换格式被使用(和滥用)的不幸之处在于它具有特定于 Javascript 的特性。
    • 真正的原因 - 也检查这个答案 - stackoverflow.com/questions/4201441/…
    • Tl;dr:他们不想处理 ECMAScript 对(不带引号的)保留关键字作为键的限制,所以他们只需要引用所有键。
    【解决方案2】:

    使用字符串作为键是正确的。以下是 RFC 4627 - JavaScript Object Notation (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 here

    【讨论】:

    • 为了完成这个想法,第 2.5 节说:A string begins and ends with quotation marks.
    【解决方案3】:

    来自 2.2。对象

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

    2.5 开始。字符串

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

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

    【讨论】:

      【解决方案4】:

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

      string
          ""
          " chars "
      

      【讨论】:

        【解决方案5】:

        是的。但如果您需要其他方式,请查看 JSON5

        JSON5 是 JSON 的超集,允许 ES5 语法,包括:

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

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

        【讨论】:

          【解决方案6】:

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

          但是,您仍然应该在键名中使用带引号的那个,因为它更传统,这使得键名更加简单,并且能够使用空格等键名。

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

          编辑//检查这个:What is the difference between JSON and Object Literal Notation?

          【讨论】:

          • 它可能更传统,但也更多打字。
          • OP 中的两个选项中,只有带引号的那个是有效的JSON。另一个不是。它们不可互换。它们唯一起作用的地方是作为 not JSON 的 JS 代码。 What is the difference between JSON and Object Literal Notation? 所以,引号不是“更传统的”——它们是问题所问上下文中的唯一约定。
          • @VLAZ 是对的,这就是我写“在你的情况下”的原因
          【解决方案7】:

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

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

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

          【讨论】:

          • 接受的答案和定义 JSON 的 RFC 都说引号是必需的。
          • 确实如此,但值得注意的是逻辑上不需要。我想所有浏览器控制台的 JavaScript Object Notation 输出都是错误的,我们应该告诉某人修复它。也许浏览器控制台为对象输出的不是 JSON,因此可能不需要 JSON 作为规范定义,也不需要在大多数地方以这种方式实现。无论如何,我只是想证明这一点,以不同的眼光看待事实。真的也许应该改变规范,“引用键”根本不需要任何对我个人重要的地方。 (只是在实践中没有这样使用。)
          • 您混合了三种不同的东西:JSON、JavaScript 对象文字和浏览器开发工具控制台输出。当您在控制台中键入 obj 时,浏览器会显示一些人类可读的对象表示。它可能将其显示为对象文字(就像在您的示例中所做的那样),或者它可能使用其他一些表示,甚至是交互式表示。如果键是有效标识符而不是保留字,则 JavaScript 对象文字不需要在键名周围加上引号。但是,JSON 总是 需要在键名周围加上引号。
          • 作为进一步的例子,不要在控制台中输入obj,而是尝试JSON.stringify(obj)。现在您将看到对象的有效 JSON 表示,并带有引用的键名。相反,要查看字符串是否为有效 JSON,请尝试 JSON.parse(string)。如果键没有被引用,这将引发异常。例如,JSON.parse('{"a":"b"}') 会成功,但JSON.parse('{a:"b"}') 会失败。
          • OTOH,您对var obj = {[keyName]:"someValue"}; 的使用非常有趣!我不知道你可以在 JavaScript 对象文字中做到这一点。一些检查表明这是 ES6 中的新功能 - 在 ES5 中无法做到。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-12-18
          • 2022-01-07
          • 1970-01-01
          • 2021-10-05
          • 2017-09-24
          相关资源
          最近更新 更多