根据Crockford的json.org,JSON 对象由成员组成,成员由对组成。< / p>
每一对都由字符串和值组成,字符串定义为:
字符串是零或更多的序列 Unicode字符,用double包装 引号,使用反斜杠转义。一个 字符表示为单个 字符串。字符串非常 很像C或Java字符串。
但在实践中,大多数程序员甚至不知道JSON键应该用双引号括起来,因为大多数浏览器不需要使用双引号。
用双引号打扰你的JSON是否有意义?
有效示例:
{
"keyName" : 34
}
与无效相反:
{
keyName : 34
}
答案 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