JavaScript对象表示法是正确的JSON吗

Is JavaScript Object notation proper JSON?

本文关键字:JSON 对象 表示 JavaScript      更新时间:2023-09-26

如果在Chrome控制台中运行正确的JSON:

{"aaa":"bbb"}

我得到:

SyntaxError: Unexpected token :

然而,如果我运行例如:

{aaa:"bbb"}

它没有抱怨。同样在下面运行也很好:

aaa={"aaa":"bbb"}

我认为正确的JSON必须将属性名称用引号括起来,那么为什么会发生这种情况呢?JS对象表示法不是正确的JSON吗?

问题是由语法/解析上下文引起的。

给定{"aaa":"bbb"}作为一个程序,这是一个块[语句],其中"aaa"是一个后跟冒号的字符串,因此是无效语法。它可以最低限度地复制为:"aaa":"bbb",因为大括号只会增加混乱。

给定{aaa:"bbb"}作为一个程序,这是一个语句,其中aaa标识符)是一个标签,后跟字符串"bbb"(也在语句上下文中)。这很好,但它确实而不是返回一个对象。同样,它在语句上下文中等价于aaa:"bbb"

给定aaa={"aaa":"bbb"}作为一个程序,现在{..}表达式上下文中被解析,并被视为Object Literal;生成的对象被指定给变量。表达式上下文可以使用其他语法结构强制使用,例如+{"aaa":"bbb"}({"aaa":"bbb"})或更有用的console.log({"aaa":"bbb"})

所有这些都解决了,因为JavaScript Object Literal语法在三种情况中有两种根本不适用:

JSON几乎是,但不是JavaScript Object Literals的适当子集;使用适当的JSON工具和验证。