是否有任何实际的理由为JSON密钥使用带引号的字符串?

时间:2010-11-17 04:17:07

标签: javascript json browser double-quotes

根据Crockford的json.org,JSON 对象成员组成,成员组成。< / p>

每一对都由字符串组成,字符串定义为:

  

字符串是零或更多的序列   Unicode字符,用double包装   引号,使用反斜杠转义。一个   字符表示为单个   字符串。字符串非常   很像C或Java字符串。

但在实践中,大多数程序员甚至不知道JSON键应该用双引号括起来,因为大多数浏览器不需要使用双引号。

用双引号打扰你的JSON是否有意义?

有效示例:

{
  "keyName" : 34
}

与无效相反:

{
   keyName : 34
}

3 个答案:

答案 0 :(得分:141)

为什么JSON键应该在引号中的真正原因依赖于ECMAScript 3的标识符的语义。

Reserved words不能在没有引号的对象文字中用作属性名称,例如:

({function: 0}) // SyntaxError
({if: 0}) // SyntaxError
({true: 0}) // SyntaxError
// etc...

如果您使用引号,则属性名称有效:

({"function": 0}) // Ok
({"if": 0}) // Ok
({"true": 0}) // Ok

自己的Crockford在this talk中解释了这一点,他们希望保持JSON标准简单,他们不希望对它有所有语义限制:

  

...

     

那是我们发现的时候   不带引号的名称问题。事实证明   ECMA脚本3有一个保留的whack   字政策。保留字必须是   引用关键位置,这是   真的很麻烦。当我到处走走时   把它公式化成一个标准,我   不想要把所有的   标准中的保留字,   因为它看起来真的很蠢。

     

当时,我试图说服   人:是的,你可以写   JavaScript中的应用程序,它是   实际上去工作,这是一个很好的   语言。那时我不想说   在同一时间:看看这个   他们真的很蠢!所以我   相反,我们决定引用它   键。
  那样,我们不必告诉   任何关于它是如何打击的人。

     

这就是为什么,直到今天,还引用了密钥   JSON。

     

...

ECMAScript第5版标准对此进行了修复,现在在ES5实现中,甚至可以在没有引号的情况下使用保留字,包括对象文字和成员访问(obj.function在ES5中确定)。

仅仅是为了记录,软件供应商最近正在实施此标准,您可以在此compatibility table上查看哪些浏览器包含此功能(请参阅保留字作为属性名称)< / p>

答案 1 :(得分:16)

是的,它是无效的JSON,在许多情况下会被拒绝,例如jQuery 1.4+有一个检查,使得不带引号的JSON无声地失败。为什么符合要求?

让我们再看一个例子:

{ myKey: "value" }
{ my-Key: "value" }
{ my-Key[]: "value" }

...所有这些 对引号有效,为什么不一致并在所有情况下都使用它们,从而消除了出现问题的可能性?

Web开发人员世界中的一个更常见的例子:在大多数浏览器中有成千上万的无效HTML示例......这是否会使调试或维护变得更少痛苦?完全没有,恰恰相反。

同样@ Matthew在下面的评论中提出了最佳观点,此已经失败,不带引号的密钥会在所有主要浏览器中引发JSON.parse()的语法错误(以及任何其他正确实现它的人,you can test it here

答案 2 :(得分:-3)

YAML实际上是JSON的超集,支持您想要做的事情。虽然它是一个超集,它可以让你保持简单。

YAML呼吸新鲜空气,值得您花时间去看看它。最好的起点是:http://en.wikipedia.org/wiki/YAML

阳光下的每种语言都有libs,包括JS,例如https://github.com/nodeca/js-yaml