代码之家  ›  专栏  ›  技术社区  ›  Mark Rogers

对于JSON键使用带引号的字符串有什么实际的原因吗?

  •  81
  • Mark Rogers  · 技术社区  · 14 年前

    根据克罗克福德的 json.org ,一个JSON 对象 是由 成员 ,它由 .

    每一双都是由 一串 以及 价值 ,带有 一串 定义为:

    字符串是一个零或更多的序列 Unicode字符,用双字符包装 引号,使用反斜杠转义。一个 字符表示为单个 字符串。一根绳子 很像C或Java字符串。

    但实际上,大多数程序员甚至不知道JSON键应该被双引号包围,因为大多数浏览器不需要使用双引号。

    用双引号括住JSON有什么意义吗?

    有效示例:

    {
      "keyName" : 34
    }
    

    与无效者相反:

    {
       keyName : 34
    }
    
    3 回复  |  直到 9 年前
        1
  •  148
  •   Christian C. Salvadó    14 年前

    之所以JSON键应该用引号括起来,真正的原因在于ECMAScript 3标识符的语义。

    Reserved words 不能用作 属性名称 在不带引号的对象文本中,例如:

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

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

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

    克罗克福德自己解释的 this talk ,他们希望保持JSON标准的简单性,并且不希望对其进行所有语义限制:

    ....

    就在那时我们发现 未引用的名称问题。结果是 ECMA脚本3保留了一个whack 文字政策。保留字必须是 在关键位置引用,即 真讨厌。当我出去的时候 把这个公式化为一个标准,我 不想把所有的 标准中的保留字, 因为这看起来很愚蠢。

    当时,我想说服 人们:是的,你可以写 在JavaScript中的应用程序 真的要去工作了 语言。我不想说, 同时:看看这个 他们做了一件非常愚蠢的事!所以我 我决定,让我们引用 钥匙。
    这样,我们就不用说了 任何人都知道这是怎么回事。

    这就是为什么直到今天 JSON。

    ...

    ECMAScript第5版标准修复了这一点,现在在ES5实现中,即使保留字也可以在对象文本和成员访问中不加引号地使用( obj.function 在ES5中可以)。

    为了便于记录,这个标准现在正由软件供应商实现,您可以看到哪些浏览器包含这个特性 compatibility table (见 保留字作为属性名 )

        2
  •  16
  •   Community T.Woody    7 年前

    是的,它是无效的JSON,在很多情况下会被拒绝,例如jQuery 1.4+有一个检查,使得未引用的JSON无声地失败。为什么? 顺从?

    再举一个例子:

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

    ……所有这些 使用引号是有效的,为什么不保持一致并在所有情况下都使用它们,从而消除出现问题的可能性?

    在web开发人员世界中,有一个更常见的例子:在大多数浏览器中有成千上万的无效HTML呈现的例子……这是否会减少调试或维护的痛苦?一点也不,恰恰相反。

    同时@ Matthew 在下面的评论中提出了最好的观点 已经 失败,未引用的键将抛出语法错误 JSON.parse() 在所有主要浏览器(以及其他正确实现它的浏览器)中, you can test it here .

        3
  •  -3
  •   user1649339    11 年前

    YAML实际上是JSON的超集,它支持您想要做的事情。虽然它是一个超集,但它可以让你保持你想要的简单。

    山药是一种新鲜空气,也许值得你花时间看看。最好从这里开始: http://en.wikipedia.org/wiki/YAML

    太阳底下的每种语言都有lib,包括JS,eg https://github.com/nodeca/js-yaml