【问题标题】:Why are there commas between objects in JSON?为什么 JSON 中的对象之间有逗号?
【发布时间】:2016-07-06 09:14:20
【问题描述】:

所以我们得到了一些如下所示的 JSON:

"myBigObj": { 
  "myFirstSmallerObj": { 
    "attr1": 42, // in fact!? you could even git rid of these commas too, if all keys are "keys"?
    "attr2": 43 
  }, 
  "mySecondSmallerObj": { 
    "attr1": true, 
    "attr2": false 
  }  
}

现在,我明白了为什么必须在属性之间使用逗号 - 它分隔了键:值部分,因此您可以知道 attr1: 42 的开始和结束位置(而不是 attr1:trueattr2:false)。

这让我想到了我的问题:为什么对象之间有逗号?似乎{} 配对提供了足够的信息来判断对象从哪里开始、结束以及它们是如何嵌套的......或者?

【问题讨论】:

  • 一致的结构使解析更容易。如果逗号在某些情况下只存在,解析器必须更复杂......
  • @CBroe {} 不是用于数组,而是用于对象。 [] 用于数组。
  • 这些似乎是 JS 对象文字,而不是 JSON 文本。你问的是 JavaScript 还是 JSON?
  • 我的意思是 JSON ......只是对它草率,因为我对这两者都不熟悉。将更新问题。
  • ... 但问题仍然是 JS 对象字面量,对吧? (除了关于 attr:value 逗号分隔符的旁白)

标签: javascript json sorting object


【解决方案1】:

为了这个问题,我将使用术语“JSON”而不是“JS obj.literals”。我所说的大部分(如果不是全部)应该适用于 JS obj。不过是文字。

您的问题有点像问“为什么吃喝玩乐装在袋子里?”在大多数情况下,他们只是这样做。能够防止彩虹糖在你手中融化是有一点用处的,但你可以很容易地在没有袋子的情况下拥有彩虹糖。

逗号也是如此,它们的存在只是为了真正表达“这之后还有一些事情,这件事到此结束”。如果您真的想要,可以在没有它们的情况下创建自己的对象表示法(和解析器)——从这个意义上说,它们不是必需的。

在 JSON(和 JS obj.literals)的情况下,逗号用于保持内容的一致性和可读性。 JSON 不是为了某种“优化的数据格式”而创建的,它主要应该是人类可读的。这意味着让事情变得直观,例如 always 用逗号分隔字段。

逗号(正如我刚才所说)有助于使 JSON 更易于阅读。大多数讲英语的人会认为逗号是分隔列表中的项目,这就是他们在 JSON 中所做的:它们分隔对象或数组中的项目。

在定义 JS obj 时,我能想到的唯一用处是逗号。文字,使用逗号将正则表达式文字与字段名称分开,当两者在同一行时 (regex:/whatever/nextfield:"stuff")。不过,这可以通过将字段名称放在引号中或创建 RegExp 对象来解决。

tl;dr:逗号的存在主要是为了帮助 JSON 可读。它们没有真正的句法目的,因为人们可以在没有逗号的情况下制作自己的符号,而且效果很好。

【讨论】:

    【解决方案2】:

    您的示例是对象的对象。但是如果你有一个对象、数组和单个属性的对象呢?观察:

    myBigObj: { 
      "myFirstSmallerObj": { 
        "attr1": 42, 
        "attr2": 43 
      }, 
      "mySecondSmallerObj": { 
        "attr1": true, 
        "attr2": false 
      },
      "myFirstArray": [1,2,3],
      "myString": "someString"
    }
    

    在这种情况下,{} 配对不足以判断myBigObj 的结束位置。顺便说一句,有效的 JSON 要求属性名称用双引号括起来。

    【讨论】:

    • 我不确定您所说的“不足以判断 myBigObj 的结束位置”是什么意思,您能详细说明一下吗?
    • 这是对原始帖子中此声明的回应:“似乎{} 配对提供了足够的信息来判断对象的开始、结束以及它们的嵌套方式......”
    • 但他们有吗?您可以省略逗号(或使它们成为可选),它仍然是一个明确的语法。
    • 只要: 分开key:value 对,并且只要值类型被标记([arrays], '"strings"'...),我想你仍然可以知道在哪里myBigObj 开始和结束。还是?
    【解决方案3】:

    这不是一个有效的 JSON 对象。

    您可以使用在线验证器来确认: https://jsonformatter.curiousconcept.com/

    【讨论】:

    【解决方案4】:

    JSON 中属性之间的逗号来自 JavaScript 文字对象上的相同逗号,您可以在此网站 (http://www.dyn-web.com/tutorials/object-literal/) 上查看它们,其中说“JavaScript 对象文字是一个逗号分隔的名称-值对包装列表在花括号中。对象字面量封装数据,将其封装在一个整洁的包中。这最大限度地减少了全局变量的使用,这些变量在组合代码时可能会导致问题。"

    在您的情况下,您使用的 json 如下:

    "myBigObj": { 
      "myFirstSmallerObj": { 
        "attr1": 42, 
        "attr2": 43 
      }, 
      "mySecondSmallerObj": { 
        "attr1": true, 
        "attr2": false 
      }  
    }
    

    其中 myBigObj 有两个属性,myFirstSmallerObj 和 mySecondSmallerObj,每个属性都是另一个对象,但如果不是,逗号仍然存在,如下所示:

    "myBigObj": { 
      "myFirstSmallerObj": [42, 43], 
      "mySecondSmallerObj": { 
        "attr1": true, 
        "attr2": false 
      }  
    }
    

    更多参考:http://www.w3schools.com/js/js_objects.asp

    【讨论】:

      猜你喜欢
      • 2019-05-10
      • 1970-01-01
      • 1970-01-01
      • 2019-01-26
      • 1970-01-01
      • 1970-01-01
      • 2016-04-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多