为什么 JSON.parse 对引号如此挑剔?

Why is JSON.parse so picky with quotes?

基本上,我试图通过向 JSON.parse() 提供字符串来创建这样的对象:

a = {x:1} 
// -> Object {x: 1}

凭直觉我试过了:

a = JSON.parse('{x:1}')
// -> Uncaught SyntaxError: Unexpected token x

经过一些摆弄我发现:

a = JSON.parse('{"x":1}')
// -> Object {x: 1}

但后来我不小心更改了语法并引发了奖金混乱:

a = JSON.parse("{'x':1}")
//-> Uncaught SyntaxError: Unexpected token '

所以现在我正在寻找

的解释
  1. 一个必须引用属性名字
  2. 该实现接受单引号,但在双引号上失败

正如评论中指出的那样,因为那是 JSON 规范指定的内容。 AFAIK 的原因是 JSON 是一种 数据交换 格式(与语言无关)。许多语言,甚至是那些带有散列文字的语言,都不允许将未加引号的字符串作为散列 table 键。

混淆的主要原因似乎是 JSON 和 JavaScript 对象之间的区别。


JSON(JavaScript Object Notation)是一种允许以简单格式进行数据交换的数据格式。这就是为什么只有一种有效语法的原因。它使解析更容易。您可以在 JSON website.

上找到更多信息

关于JSON的一些注意事项:

  • 密钥必须用 "
  • 引起来
  • 值可以是字符串、数字、对象、数组、布尔值或 "null"
  • 字符串值必须用 "
  • 引起来

另一方面,

JavaScript objects 与 JSON 相关(很明显),但并不完全相同。有效的 JSON 也是有效的 JavaScript 对象。然而,反之则不然。

例如:

  • 键和值可以用"'
  • 引用
  • 不必总是引用键
  • 值可能是函数或 JavaScript 对象