2011-08-03 43 views
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: '' } 
    } 
] 

namesurnameagecomments三重声明是无用的,如果我确切地知道,每一个阵列的对象具有相同的结构。
有什么数据格式可以缩小这种数组数据并且足够灵活吗?

+0

您没有提供任何有关为什么这是“超载”或您的用例不适当的解释。如果您关心数据大小,请考虑压缩 - 同样,在HTTP下,您通常可以免费获得压缩。 JSON语法通常会压缩而变得无足轻重。 – pawstrong

回答

1

无可否认,这是一个骇人听闻的解决方案,但我们已经使用它,它的工作原理。你可以将所有东西压扁成阵列。例如,上述可表示为:

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

的缺点是,在串行/解串,你必须做一些定制逻辑。然而,这确实为基于文本的解决方案带来了额外的节省,Ray是正确的 - 如果你真的想要最大限度的节省,二进制是要走的路。

+1

如果每个项目具有完全相同的格式,则第一行始终存储CSV格式! –

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的基于数组的解决方案。