轻量级数据格式

时间:2011-08-03 06:35:48

标签: dataformat

众所周知,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: '' }
    }
]

namesurnameagecomments三重声明是无用的,如果我确切知道,每个数组对象都具有相同的结构。
是否存在可以缩小此类阵列数据并且足够灵活的数据格式?

2 个答案:

答案 0 :(得分:1)

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

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

延迟补充:

哦,我的,在过去一年中使用Hadoop处理数十亿字节后,我怎么能忘记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基于数组的解决方案。

答案 1 :(得分:1)

不可否认,这是一个hackish解决方案,但我们已经使用它并且它有效。您可以将所有内容展平为数组。例如,上述内容将表示为:

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

缺点是在序列化/反序列化时,你必须做一些自定义逻辑。然而,这确实为基于文本的解决方案带来了额外的节省,而Ray是正确的 - 如果你真的想要最大限度的节省,那么二进制就可以了。