所以我们有一些看起来像这样的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
) 。
这让我想到了我的问题:为什么对象之间有逗号?似乎{}
配对提供了足够的信息来告诉对象的开始,结束位置以及它们是如何嵌套的......或者?
答案 0 :(得分:3)
为了这个问题,我将使用术语“JSON”而不是“JS obj。literals”。我说的大多数(如果不是全部)应该适用于JS obj。但是文字。
你的问题有点像问“为什么Skittles放进包里?”在大多数情况下,他们只是这样做。能够保持Skittles不会在手中融化有一点实用性,但你可以很容易地在没有包的情况下使用Skittles。
对于逗号来说也是如此,他们只是真的说“在此之后有一些东西,这件事就在这里结束了。”如果你真的想要的话,你可以制作你自己的对象符号(和解析器) - 在这个意义上它们不是必需的。
在JSON(和JS obj。文字)的情况下,逗号用于保持事物的一致性和可读性。 JSON并非被创建为某种“优化数据格式”,它主要应该是人类可读的。这意味着让事情变得直观,比如总是用逗号分隔字段。
逗号(正如我刚才所说)有助于使JSON更具人性化。大多数英语使用者会将逗号视为分隔列表中的项目,这是他们在JSON中的作用:它们分隔对象或数组中的项目。
我能想到逗号可能有用的唯一情况是,在定义JS obj时。文字,使用逗号将正则表达式文字与字段名称分开,当两者都在同一行(regex:/whatever/nextfield:"stuff"
)时。这可以通过将字段名称放在引号中,或者创建RegExp
对象来解决。
tl; dr:逗号的存在主要是为了帮助JSON成为人类可读的。它们没有真正的语法目的,因为没有逗号就可以制作自己的符号,并且它的工作正常。
答案 1 :(得分:2)
您的示例是对象的对象。但是,如果你有对象,数组和各个属性的对象呢?观察:
myBigObj: {
"myFirstSmallerObj": {
"attr1": 42,
"attr2": 43
},
"mySecondSmallerObj": {
"attr1": true,
"attr2": false
},
"myFirstArray": [1,2,3],
"myString": "someString"
}
在这种情况下,{}
配对不足以说明myBigObj
的结束位置。顺便说一句,有效的JSON要求将属性名称括在双引号中。
答案 2 :(得分:0)
这不是有效的JSON对象。
您可以使用在线验证器确认: https://jsonformatter.curiousconcept.com/
答案 3 :(得分:0)
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
}
}