Javascript 对于JSON键使用带引号的字符串有什么实际原因吗?

Javascript 对于JSON键使用带引号的字符串有什么实际原因吗?,javascript,json,browser,double-quotes,Javascript,Json,Browser,Double Quotes,根据Crockford的说法,JSON对象由成员组成,成员是成对的 每对由一个字符串和一个值组成,其中一个字符串定义为: 字符串是一个零或更多的序列 Unicode字符,用双精度包装 引号,使用反斜杠转义。A. 字符表示为单个字符 字符串。一根绳子很长 很像C或Java字符串 但实际上,大多数程序员甚至不知道JSON键应该用双引号括起来,因为大多数浏览器不需要使用双引号 用双引号将JSON括起来有意义吗 有效示例: { "keyName" : 34 } 与无效者相反: { keyNa

根据Crockford的说法,JSON对象由成员组成,成员是成对的

每对由一个字符串和一个值组成,其中一个字符串定义为:

字符串是一个零或更多的序列 Unicode字符,用双精度包装 引号,使用反斜杠转义。A. 字符表示为单个字符 字符串。一根绳子很长 很像C或Java字符串

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

用双引号将JSON括起来有意义吗

有效示例:

{
  "keyName" : 34
}
与无效者相反:

{
   keyName : 34
}

是的,它是无效的JSON,在许多情况下会被拒绝,否则,例如jQuery1.4+有一个检查会使不带引号的JSON以静默方式失败。为什么不顺从呢

让我们再举一个例子:

{ myKey: "value" }
{ my-Key: "value" }
{ my-Key[]: "value" }
({function: 0}) // SyntaxError
({if: 0}) // SyntaxError
({true: 0}) // SyntaxError
// etc...
…所有这些在引用时都是有效的,为什么不保持一致并在所有情况下使用它们,从而消除出现问题的可能性

在web开发人员的世界中,还有一个更常见的例子:在大多数浏览器中呈现的无效HTML的例子有数千个……这会减少调试或维护的痛苦吗?一点也不,恰恰相反


此外,@还充分利用了下面的注释,这个已经失败了,未加引号的键将在所有主要浏览器(以及正确实现它的任何其他浏览器)中引发语法错误。

关于JSON键应该加引号的真正原因,依赖于ECMAScript 3标识符的语义

不能在不带引号的对象文字中用作属性名,例如:

{ myKey: "value" }
{ my-Key: "value" }
{ my-Key[]: "value" }
({function: 0}) // SyntaxError
({if: 0}) // SyntaxError
({true: 0}) // SyntaxError
// etc...
如果使用引号,则属性名称有效:

({"function": 0}) // Ok
({"if": 0}) // Ok
({"true": 0}) // Ok
Crockford自己在中解释了这一点,他们希望JSON标准保持简单,并且不希望对其有所有语义限制:

就在那时我们发现了 未引用的名称问题。事实证明 ECMA脚本3保留了一个重击 世界政策。保留字必须是 在关键位置引用,即 真讨厌。当我四处走动时 为了将其公式化为标准,我 不想把所有的 标准中的保留字, 因为这看起来很愚蠢

当时,我正试图说服 人们:是的,你可以写作 JavaScript中的应用程序,它是 真的要去工作了,这是一个好机会 语言。我不想说, 同时:看看这个 他们做了一件非常愚蠢的事!所以我 相反,让我们引用 钥匙。
这样,我们就不用说了 任何人都知道这有多糟糕

这就是为什么,直到今天,钥匙都被引用了 JSON

ECMAScript第5版标准解决了这一问题,现在在ES5实现中,即使是保留字也可以在对象文本和成员访问中不加引号地使用(
obj.function
Ok in ES5)


记录在案的是,软件供应商现在正在实施这个标准,您可以看到哪些浏览器在这个标准上包含这个功能(将保留字作为属性名)

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

YAML是一股新鲜空气,值得你花时间去看看。最好从这里开始:


阳光下的每种语言都有lib,包括JS,例如“为什么要费心去做正确的事情?”这种懒惰的想法会导致网站充斥着无效的标记。如果某些浏览器确实需要双引号,那么您的代码将是经得起未来考验的。“为什么要费心去做正确的事情?”-如果没有真正的好处,为什么要费心去遵循其他人都没有的惯例呢?也许你把懒惰思维和实用主义混为一谈。@Mark-“其他人都不会这么做”…你从哪里得到这个想法的?每个主要平台中内置的JSON序列化程序都会正确引用。@例如,Mark Rogers PHP JSON_encode函数会生成带有双引号字符串的有效JSON。也许你在考虑JavaScript中的对象文字?诚然,这些都可以在不引用键的情况下工作,但这不是JSON。作为记录,几年前当我发布这篇文章时,我对JSON和@JAL建议的对象文字符号之间的区别感到困惑。两者的语法非常相似,这最终导致了在描述问题时的一些混乱。是的,我有一些旧的ajax应用程序生成schonky json服务器端,在升级到jquery 1.4时失败,因为键名周围缺少双引号。您可能需要添加一点,即所有主要浏览器的
JSON.parse
也会正确地拒绝它。我很好奇,在什么情况下,JQuery 1.4会因为这种类型的无效json而自动失败?@Mark-在任何情况下,它没有正确引用或具有无效字符…基本上,它会因为任何无效的json而失败。这很有趣,这不是我使用JQuery 1.4的经验。此外,我不认为jquery负责创建json对象,这不是浏览器的javascript解释器所做的吗?您是指Jquery json反序列化吗?@Mark,不客气。请记住,JSON只是一种与语言无关的数据交换格式,即使其语法受Javascript对象文字语法的启发,它们之间也存在差异(远远不止是带引号的键)。@CMS,那么为什么它只能是双引号呢?为什么单引号在JSON中无效?为了使JSON标准尽可能简单,不允许使用单引号。JSON只需要是Javascript的一个子集,它不需要实现尽可能多的Javascript。JSON遵循ES5语法,因此支持不带引号的键。该库具有兼容的
parse
stringify
方法