0

众所周知,JSON 是比 XML 更轻量的数据格式,并且更适合使用。但是,当您传输具有相同结构的大型对象数组时,JSON 也会出现数据过载。例如:

[
    {
        name: 'John',
        surname: 'Smith',
        info: { age: 25, comments: '' }
    },
    {
        name: 'Sam',
        surname: 'Black',
        info: { age: 27, comments: '' }
    },
    {
        name: 'Tom',
        surname: 'Lewis',
        info: { age: 21, comments: '' }
    }
]

name, surname,agecomments三元组声明是没用的,如果我确切地知道,每个数组对象都具有相同的结构。
是否有任何数据格式可以缩小此类数组数据并足够灵活?

4

2 回答 2

2

诚然,这是一个骇人听闻的解决方案,但我们已经使用它并且它有效。您可以将所有内容展平为数组。例如,上面将表示为:

[
    ['John','Smith',[24,'']],
    ['Sam','Black',[27,'']],
    ['Tom','Lewis',[21,'']]
]

缺点是在序列化/反序列化时,您必须执行一些自定义逻辑。但是,这确实会为基于文本的解决方案带来额外的节省,Ray 是对的——如果你真的想要最大程度地节省,二进制是要走的路。

于 2011-08-03T06:44:21.220 回答
1

好吧,如果您有文本格式,YAML 会尝试使用最少的标记。它几乎摆脱了分号和大括号。但是文本压缩得很好。

但是,如果您想删除属性名称中的冗余,则必须使用二进制格式。查看 MessagePack、Protocol Buffers 或 Avro。我不知道有任何基于文本的格式可以消除这种冗余。

后期添加:

哦,天哪,在过去一年使用 Hadoop 一次处理数十 GB 之后,我怎么会忘记 CSV?哎呀。第一行可以是模式,你真的不需要引号。分隔符可以由您决定。像这样的东西:

name|surname|infoage|infocomments
John|Smith|24|
Sam|Black|27|Hi this is a comment
Tom|Lewis|21|This comment has an \| escaped pipe

对于小型文档,它可能比某些二进制格式小,但二进制适合存储实数。

此外,只有当您拥有一系列相同的项目时,CSV 才真正有用。对于复杂的对象层次结构,请使用二进制、YAML 或 @incaren 的基于数组的解决方案。

于 2011-08-03T06:37:59.070 回答