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

时间:2016-03-19 16:42:17

标签: javascript json sorting object

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

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

4 个答案:

答案 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 
  }  
}

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