为什么 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 '
所以现在我正在寻找
的解释
- 一个必须引用属性名字
- 该实现接受单引号,但在双引号上失败
正如评论中指出的那样,因为那是 JSON 规范指定的内容。 AFAIK 的原因是 JSON 是一种 数据交换 格式(与语言无关)。许多语言,甚至是那些带有散列文字的语言,都不允许将未加引号的字符串作为散列 table 键。
混淆的主要原因似乎是 JSON 和 JavaScript 对象之间的区别。
JSON(JavaScript Object Notation)是一种允许以简单格式进行数据交换的数据格式。这就是为什么只有一种有效语法的原因。它使解析更容易。您可以在 JSON website.
上找到更多信息
关于JSON的一些注意事项:
- 密钥必须用
"
引起来
- 值可以是字符串、数字、对象、数组、布尔值或 "null"
- 字符串值必须用
"
引起来
另一方面,JavaScript objects 与 JSON 相关(很明显),但并不完全相同。有效的 JSON 也是有效的 JavaScript 对象。然而,反之则不然。
例如:
- 键和值可以用
"
或'
引用
- 不必总是引用键
- 值可能是函数或 JavaScript 对象
基本上,我试图通过向 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 '
所以现在我正在寻找
的解释- 一个必须引用属性名字
- 该实现接受单引号,但在双引号上失败
正如评论中指出的那样,因为那是 JSON 规范指定的内容。 AFAIK 的原因是 JSON 是一种 数据交换 格式(与语言无关)。许多语言,甚至是那些带有散列文字的语言,都不允许将未加引号的字符串作为散列 table 键。
混淆的主要原因似乎是 JSON 和 JavaScript 对象之间的区别。
JSON(JavaScript Object Notation)是一种允许以简单格式进行数据交换的数据格式。这就是为什么只有一种有效语法的原因。它使解析更容易。您可以在 JSON website.
上找到更多信息关于JSON的一些注意事项:
- 密钥必须用
"
引起来
- 值可以是字符串、数字、对象、数组、布尔值或 "null"
- 字符串值必须用
"
引起来
另一方面,
JavaScript objects 与 JSON 相关(很明显),但并不完全相同。有效的 JSON 也是有效的 JavaScript 对象。然而,反之则不然。
例如:
- 键和值可以用
"
或'
引用
- 不必总是引用键
- 值可能是函数或 JavaScript 对象