为什么 JSON 中的对象之间有逗号
Why are there commas between objects in JSON?
所以我们有一些看起来像这样的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
- 全局变量和全局对象的属性之间有什么区别吗
- JavaScript中的函数和对象之间没有区别吗?
- 在控制器和数据对象之间同步数据
- Javascript-defineProperty和直接在对象上定义函数之间的区别
- XMLHttpRequest对象的open()和send()方法之间有什么区别
- Firefox插件SDK:在侧边栏和主脚本之间通信对象
- 如何将json文件中的数据提取到对象数组中,并在两个控制器之间共享
- Angular 2,在没有直接关系的两个组件之间共享一个对象
- 尝试在一个对象的值和一个对象数组之间进行匹配
- 在angularJS中使用模态窗口时,在控制器之间共享对象数组
- 快递之间的区别.路由器() vs 多个 express() 对象
- 节点模块对象范围:在所有函数之间共享一个对象
- 在不同数据选项之间循环迭代对象
- 在 JavaScript 中的对象内分配柯里函数时,这和 self 之间有什么区别吗?
- 不同对象之间的递归,并将它们唯一地组合在一起,不重复
- 两个对象之间的Javascript原型
- 什么's对象文字中带引号和不带引号的键之间的区别
- 只有一些带undercore.js的字段在对象数组之间求交集和等于
- 用户如何获取两个时间戳之间的对象
- 在window.onload之前/之后创建对象之间的区别