如果在Chrome控制台中我运行了正确的JSON:
{"aaa":"bbb"}
我明白了:
SyntaxError: Unexpected token :
但是,如果我运行例如:
{aaa:"bbb"}
它没有抱怨。在下面运行也很好:
aaa={"aaa":"bbb"}
我认为正确的JSON必须包含用引号括起来的属性名称,为什么会发生这种情况呢? JS对象表示法不是正确的JSON吗?
答案 0 :(得分:13)
问题是由语法/解析上下文引起的。
将{"aaa":"bbb"}
作为程序,这是Block [statement],其中“aaa”是 String 后跟冒号,因此是无效语法。它可以最低限度地复制为:"aaa":"bbb"
,因为括号什么也没做,只会增加混乱。
将{aaa:"bbb"}
作为一个程序,这是语句,其中aaa
(标识符)是Label后跟字符串"bbb"
(也在语句上下文中)。没关系,但不返回一个对象。同样,它在语句上下文中等同于aaa:"bbb"
。
将aaa={"aaa":"bbb"}
作为程序,现在{..}
在表达式上下文中解析并视为Object Literal;生成的对象将分配给变量。可以使用其他语法结构强制表达式上下文,例如+{"aaa":"bbb"}
,({"aaa":"bbb"})
或更有用的console.log({"aaa":"bbb"})
。
完全消除了这一切,因为JavaScript Object Literal语法在三种情况中只有两种不适用:
JSON是almost-but-not-quite JavaScript对象文字的正确子集;使用适当的JSON工具和验证。