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

时间:2009-06-04 09:22:18

标签: json specifications standards-compliance

实施例: 以下代码是否对JSON Spec有效?

{
    precision: "zip"
}

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

{
    "precision": "zip"
}

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

6 个答案:

答案 0 :(得分:130)

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

答案 1 :(得分:128)

是的,你需要引号。这样可以简化并避免为javascript保留关键字设置另一种转义方法,即{for:"foo"}

答案 2 :(得分:12)

来自 2.2。对象

  

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

2.5。字符串

  

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

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

答案 3 :(得分:6)

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

string
    ""
    " chars "

答案 4 :(得分:2)

是的。但是,如果您另有需要,请签出 JSON5

JSON5是JSON的超集,它支持ES5语法,包括:

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

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

答案 5 :(得分:-2)

既然你可以把“parent.child”点缀表示法,你不必把父[[child]]也有效和有用,我会说这两种方法在技术上都是可以接受的。解析器都应该做好两种方式。如果您的解析器不需要键上的引号,那么最好不要放置它们(节省空间)。将它们称为字符串是有意义的,因为它们就是这样,并且因为方括号使您能够使用键的值,所以基本上它完全没有意义。 在Json你可以放......

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

>obj
Object {someKey: "someValue"}

没问题就好了,如果你需要一个键值,没有引用就行不通,所以如果没有,你就不能,所以你不会这样“你不需要引号键”。即使说它们在技术上是弦乐也是对的。逻辑和用法另有说法。在我们从任何浏览器的控制台运行的示例中,它也没有为obj正式输出Object {“someKey”:“someValue”}。