json中的数组结构是否冗余?

Is the array structure redundant in json?

https://www.json.org/中说:

JSON is built on two structures:

A collection of name/value pairs. In various languages, this is realized as an object, record, struct, dictionary, hash table, keyed list, or associative array.

An ordered list of values. In most languages, this is realized as an array, vector, list, or sequence.

我的问题是:

为什么 json 被设计为使用两种类型的数据结构而不是一种? (仅限 name/value 对)

例如,

我用下面两种方法来描述School结构(School包含多个Students):

1.

{
    "Student" : [
        { "Name" : "Peter", "Sex" : "Male" },
        { "Name" : "Linda", "Sex" : "Female" },
    ]
}

2.

{
    "Student" : {
        "0" : { "Name" : "Peter", "Sex" : "Male" },
        "1" : { "Name" : "Linda", "Sex" : "Female" },
    }
}

哪个更好?

我喜欢第二个。

为什么?

因为在我看来,成员"Student"是数组或映射,有序或无序,有界或无界,应该在其元数据而不是实例数据中定义。

上面的两个学校json数据都是实例数据! (注意:符号'[]'表示"type infomation",应该在元数据中定义。现在它是多余的......)

当我使用类似 XPath 的语法访问上面示例中的 "Name" 成员时,它们没有什么不同:

  1. School.Student[0].Name <---[0] 作为数组索引
  2. School.Student[0].Name <---[0] as map key

XML中的同一个例子,只有一种表达方式:

<School>
    <Student Name="Peter" Sex="Male"/>
    <Student Name="Linda" Sex="Female"/>
</School>

我听到有人声称 XML 是多余的,因为它是结束标记和属性(相对于 s-expression)。

不过我觉得XML的冗余只是在语法上,Json的冗余是在语义上。

我说得对吗? 非常感谢。

冗余什么?

讨论数据传输的理论?那么是的,它是多余的,因为它支持的其他结构可以表示数组。

平衡稀疏性、表示完整性、人类读者和作者的简单性、软件解析器和生成器的简单性、解析和生成的速度、映射到数据结构的简单性和验证的简单性——也就是说,实际的设计目标——然后没有。能够直接编码数组有利于稀疏性、人的简单性、验证的简单性(如果它在语法上是一个有效的数组,它就是一个有效的数组,这不一定来自可以省略索引而没有单独的特定于应用程序的映射规则来处理这个问题)和生产速度(如果某些东西映射到增加的指数上,那么我们被迫可能会发现有人将它们混淆)。在分析可以表示的意义上什么是冗余,在不提供实际利益的意义上不是冗余。

在第二种情况下 "beyond what we need or want" redundant 具有相当贬义的含义,而在其他情况下 redundant 可以是正面的事情(有冗余给了你处理损失的空间,在不同情况下捕捉错误的能力等等)。这里的冗余属于第二种;我们可以使用没有数组的 JSON 版本,所以我们严格来说并不需要它,但是生活要容易得多,因为我们有它,而且几乎没有人会去努力制作一个可怕的将升序整数映射到元素只是为了让那些解析它的人的生活更难。