Mar*_*ers 82 javascript browser json double-quotes
根据Crockford的json.org,JSON 对象由成员组成,成员由成对组成.
每对由字符串和值组成,字符串定义为:
字符串是零个或多个Unicode字符的序列,用双引号括起来,使用反斜杠转义.字符表示为单个字符串.字符串非常类似于C或Java字符串.
但实际上大多数程序员甚至不知道JSON键应该用双引号括起来,因为大多数浏览器不需要使用双引号.
用双引号打扰你的JSON是否有意义?
有效示例:
{
"keyName" : 34
}
Run Code Online (Sandbox Code Playgroud)
与无效相反:
{
keyName : 34
}
Run Code Online (Sandbox Code Playgroud)
CMS*_*CMS 147
关于为什么JSON键应该在引号中的真正原因依赖于ECMAScript 3的标识符的语义.
保留字不能用作没有引号的Object Literals中的属性名称,例如:
({function: 0}) // SyntaxError
({if: 0}) // SyntaxError
({true: 0}) // SyntaxError
// etc...
Run Code Online (Sandbox Code Playgroud)
如果使用引号,则属性名称有效:
({"function": 0}) // Ok
({"if": 0}) // Ok
({"true": 0}) // Ok
Run Code Online (Sandbox Code Playgroud)
自己的Crockford在本次演讲中解释了这一点,他们希望将JSON标准保持简单,并且他们不希望对它有所有这些语义限制:
....
那时我们发现了不带引号的名字问题.事实证明,ECMA Script 3有一个重击保留字策略.保留字必须在关键位置引用,这实在是令人讨厌.当我开始将其公式化为标准时,我不想将所有保留字放在标准中,因为它看起来真的很愚蠢.
当时,我试图说服人们:是的,你可以用JavaScript编写应用程序,它实际上可以工作,而且它是一种很好的语言.那时我不想说:看看他们做的这个非常愚蠢的事情!所以我决定,让我们只是引用键.
这样,我们就不必告诉任何人这是多么糟糕.这就是为什么,直到今天,密钥都是用JSON引用的.
...
ECMAScript第5版标准对此进行了修复,现在在ES5实现中,甚至可以在没有引号的情况下使用保留字,包括对象文字和成员访问(obj.function在ES5中为Ok).
仅仅是为了记录,这个标准目前正由软件供应商实施,您可以在此兼容性表中查看哪些浏览器包含此功能(请参阅保留字作为属性名称)
Nic*_*ver 16
是的,它是无效的JSON,并且在许多情况下会被拒绝,例如jQuery 1.4+有一个检查,使得不带引号的JSON无声地失败.为什么不合规?
让我们再看一个例子:
{ myKey: "value" }
{ my-Key: "value" }
{ my-Key[]: "value" }
Run Code Online (Sandbox Code Playgroud)
......所有这些将是有效的引号,为什么不保持一致,并在所有情况下使用它们,消除问题的可能性?
Web开发人员世界中的一个更常见的例子:在大多数浏览器中有成千上万的无效HTML示例......这是否会减少调试或维护的痛苦?完全没有,恰恰相反.
另外@ Matthew在下面的评论中提出了最好的观点,这已经失败,不带引号的键会JSON.parse()在所有主流浏览器(以及其他正确实现它的其他浏览器)中引发语法错误,您可以在此处进行测试.
| 归档时间: |
|
| 查看次数: |
23209 次 |
| 最近记录: |