为什么 JSON 中的对象之间有逗号

Why are there commas between objects in JSON?

本文关键字:之间 对象 JSON 为什么      更新时间:2023-09-26

所以我们有一些看起来像这样的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)。

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

为了解决这个问题,我将使用术语"JSON"而不是"JS obj. literals"。不过,我所说的大多数(如果不是全部)内容应该适用于 JS obj. 文字。

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

逗号也是如此,它们的存在只是为了真正说"在这之后有东西,这件事到此结束"。如果你真的需要,你可以在没有它们的情况下制作自己的对象符号(和解析器)——从这个意义上说,它们不是必需的。

在JSON(和JS对象文字)的情况下,逗号用于保持内容的一致性和可读性。JSON 不是为了某种"优化的数据格式"而创建的,它主要是人类可读的。这意味着要使事情变得直观,就像总是用逗号来分隔字段一样。

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

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

dr:逗号的存在主要是为了帮助JSON成为人类可读的。它们没有真正的语法目的,因为人们可以在没有逗号的情况下制作自己的符号,而且它会很好地工作。

您的示例是对象的对象。但是,如果您有一个对象、数组和单个属性,该怎么办?观察:

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

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

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

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

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

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

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

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

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

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