在https://www.json.org/中,它说:
JSON基于两种结构:
名称/值对的集合。在各种语言中,这被实现为对象,记录,结构,字典,哈希表,键控列表或关联数组。
有序的值列表。在大多数语言中,这被实现为数组,向量,列表或序列。
我的问题是:
为什么json被设计为使用两种类型的数据结构而不是一种? (仅限名称/值对)
例如,
我使用以下两种方法来描述学校结构(学校包含多个学生):
1
{
"Student" : [
{ "Name" : "Peter", "Sex" : "Male" },
{ "Name" : "Linda", "Sex" : "Female" },
]
}
2
{
"Student" : {
"0" : { "Name" : "Peter", "Sex" : "Male" },
"1" : { "Name" : "Linda", "Sex" : "Female" },
}
}
哪个更好?
我喜欢第二个。
为什么?
因为在我看来,成员“学生”是数组或地图,有序或无序,有界或无界,应该在其元数据而不是实例数据中定义。
上面的两个学校json数据都是实例数据! (注意:符号'[]'代表“类型信息”,应该在元数据中定义。现在它是多余的......)
当我使用XPath语法来访问上面示例中的“Name”成员时,它们没有区别:
XML中的相同示例只有一种表达方式:
<School>
<Student Name="Peter" Sex="Male"/>
<Student Name="Linda" Sex="Female"/>
</School>
我听说有人声称XML是多余的,因为它结束了标签和属性(相对于s-expression)。
但我认为XML的冗余仅在语法中,Json的冗余是语义上的。
我是对的吗? 非常感谢。
答案 0 :(得分:1)
冗余什么?
讨论数据传输理论?然后是的,它是多余的,因为它支持的其他结构可以代表数组。
平衡稀疏性,表征完整性,人类读者和作者的简单性,软件解析器和生成器的简单性,解析和生成的速度,映射到数据结构的简单性以及验证的简单性等问题 - 也就是说,实际设计目标 - 然后没有。能够直接编码数组有利于稀疏性,人类的简单性,验证的简单性(如果它是一个有效的数组语法,它是一个有效的数组,它不一定遵循可以省略索引而没有单独的特定于应用程序的数据规则来处理那个)和生产的速度(如果某些东西映射在增加的指数上,那么我们被迫潜在地抓住某人混合它们)。在不提供实际利益的意义上,分析可以表示什么的冗余是多余的。
在“超出我们需要或想要的东西”的第二种情况下,冗余具有相当贬义的含义,而在其他情况下,冗余可能是积极的事情(有冗余给出)你有处理损失的空间,在不同的情况下捕捉错误的能力等等)。这里的冗余是第二种;我们可以使用没有数组的JSON版本,因此我们并不严格需要它,但是生活更容易,因为我们确实拥有它并且几乎没有人会去制作一个可怕的升序整数映射元素只是为了让那些解析它的人的生活更加艰难。