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

Javascript 为什么JSON.parse对引号如此挑剔?,javascript,json,syntax,Javascript,Json,Syntax,基本上,我试图通过向JSON.parse()提供一个字符串来创建这样的对象: 直觉上我试过: a = JSON.parse('{x:1}') // -> Uncaught SyntaxError: Unexpected token x 经过一番努力,我发现: a = JSON.parse('{"x":1}') // -> Object {x: 1} 但后来我不小心改变了语法,引起了额外的混乱: a = JSON.parse("{'x':1}") //-> Uncaught

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

直觉上我试过:

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是一种数据交换格式(与语言无关)。许多语言,甚至是那些具有散列文字的语言,都不允许将不带引号的字符串作为散列表键。

    造成混淆的主要原因似乎是JSON和JavaScript对象之间的差异


    JSON(JavaScript对象表示法)是一种数据格式,旨在允许以简单格式进行数据交换。这就是为什么只有一种有效语法的原因。它使解析变得更容易。您可以在上找到更多信息

    关于JSON的一些注意事项:

    • 钥匙必须用
    • 值可以是字符串、数字、对象、数组、布尔值或“null”
    • 字符串值必须用

    另一方面,它们与JSON相关(显然),但并不完全相同。Valid JSON也是一个有效的JavaScript对象。然而,另一方面,情况并非如此

    例如:

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

    因为规范就是这么说的?但这有什么原因吗?它使解析规则保持简单。这也是为什么你永远不应该手工编写JSON的原因。“许多语言,即使是具有哈希文本的语言,也不允许将无引号的字符串作为哈希表键。“-那没有关系。它是一种数据交换格式,而不是设计成乔随机编程语言代码。XML对语言也是不可知的,允许使用单引号或双引号的属性名。这很公平,但它必须能被Joe Random Programmer读取。完全明白。但是javascript处理“somestring”的方式不应该与处理“somestring”的方式相同吗?@AndreLung-No.
    JSON.parse
    函数期望字符串由JSON数据而不是javascript数据组成。“parse”一词被广泛使用,但它有一个相当精确的定义JSON.parse不会将传入的字符串作为javascript代码直接读取,而是根据JSON规范的正式语法规则进行解析。它将其转换为符号标记,然后将其解释为javascript数据结构。但第一步要求字符串符合JSON的语法规则。如果要“解析”任意javascript字符串,请使用
    eval()
    (但我不建议这样做)
    a = JSON.parse("{'x':1}")
    //-> Uncaught SyntaxError: Unexpected token '