是否有任何实际的理由使用引号字符串作为JSON键?

ukdjmx9f  于 2023-08-08  发布在  其他
关注(0)|答案(4)|浏览(108)

根据Crockford的json.org,JSON objectmembers 组成,而 * members * 由 pairs 组成。
每一对都由一个 string 和一个 value 组成,其中 string 被定义为:
字符串是由零个或多个Unicode字符组成的序列,用双引号括起来,使用反斜杠转义。字符表示为单个字符串。字符串很像C或Java字符串。
但实际上,大多数程序员甚至不知道JSON键应该用双引号括起来,因为大多数浏览器不需要使用双引号。
用双引号将JSON括起来有意义吗?
有效示例:

{
  "keyName" : 34
}

字符串
相对于无效:

{
   keyName : 34
}

ipakzgxi

ipakzgxi1#

JSON键应该用引号的真实的原因是ECMAScript 3中标识符的语义。
保留字不能在不带引号的Object Literals中用作 * 属性名 *,例如:

({function: 0}) // SyntaxError
({if: 0}) // SyntaxError
({true: 0}) // SyntaxError
// etc...

字符串
如果使用引号,则属性名称有效:

({"function": 0}) // Ok
({"if": 0}) // Ok
({"true": 0}) // Ok


自己的Crockford在this talk中解释了它,他们希望保持JSON标准的简单性,他们不希望对它有所有这些语义限制:
....
就在那时,我们发现了未加引号的名称问题。原来ECMA脚本3有一个很大的保留字策略。保留词必须在关键位置引用,这确实是一件麻烦事。当我开始把它公式化成一个标准时,我不想把所有的保留字都放在标准中,因为这看起来真的很愚蠢。
当时,我试图说服人们:是的,你可以用JavaScript编写应用程序,它实际上是可行的,它是一种很好的语言。我不想说,然后,在同一时间:看看他们做的蠢事所以我决定,让我们引用这些键。
这样我们就不用告诉任何人这有多糟糕了
这就是为什么直到今天,JSON中的键都是带引号的。
...
ECMAScript第5版标准解决了这个问题,现在在ES5实现中,即使是保留字也可以在没有引号的情况下使用,无论是对象文字还是成员访问(ES5中的obj.function Ok)。

vxbzzdmp

vxbzzdmp2#

是的,它是无效的JSON,在许多情况下会被拒绝,例如jQuery 1.4+有一个检查,使未加引号的JSON默默地失败。为什么 * 不 * 要遵守?
让我们再举一个例子:

{ myKey: "value" }
{ my-Key: "value" }
{ my-Key[]: "value" }

字符串
...所有这些 * 将 * 是有效的报价,为什么不一致,并在所有情况下使用它们,消除了问题的可能性?
在Web开发者世界中还有一个更常见的例子:在大多数浏览器中呈现的无效HTML有成千上万个例子……这是否使调试或维护变得不那么痛苦?一点也不,恰恰相反。
此外,@Matthew在下面的评论中提出了最好的观点,这已经失败了,未加引号的键将在所有主要浏览器(以及任何其他正确实现它的浏览器)中抛出JSON.parse()的语法错误,you can test it here

iyfjxgzm

iyfjxgzm3#

如果我对标准的理解是正确的,JSON所称的“对象”实际上更接近于Map(“字典”),而不是通常意义上的实际对象。当前的标准很容易容纳允许任何类型的键的扩展,使得

{
    "1" : 31.0,
      1 : 17,
     1n : "valueForBigInt1"
}

字符串
3个不同元素的有效“对象/Map”。
如果不是因为这个原因,我相信设计师会在所有情况下都选择在键周围加上引号(可能除了关键字)。

bqf10yzr

bqf10yzr4#

YAML实际上是JSON的超集,它支持你想要做的事情。尽管它是一个超集,但它可以让你尽可能简单。
YAML是一股清新的空气,它可能值得你花时间去看看。最好的起点是这里:http://en.wikipedia.org/wiki/YAML
世界上每一种语言都有库,包括JS,例如https://github.com/nodeca/js-yaml

相关问题