有没有一些紧凑的二进制 JSON 表示形式?我知道有BSON,但即使该网页上也说:“在许多情况下,它的效率与 JSON 差不多。在某些情况下,BSON 使用的空间甚至比 JSON 更多。”
我正在寻找一种尽可能紧凑的格式,最好是某种开放标准?
有没有一些紧凑的二进制 JSON 表示形式?我知道有BSON,但即使该网页上也说:“在许多情况下,它的效率与 JSON 差不多。在某些情况下,BSON 使用的空间甚至比 JSON 更多。”
我正在寻找一种尽可能紧凑的格式,最好是某种开放标准?
[type, 1-byte char]([length, 4-byte int32])([data])
[S][512][this is a really long 512-byte UTF-8 string....]
tcpdump
来理解其表示(与 protobuf 的 varints 相反)。在简单的十六进制中,300 是 0x012C
;在 UBJ 中,是 0x69012C
(因为 0x69
是 ascii 的 i
);在 protobuf 中,0xAC02 == 1010 1100 0000 0010
。如果有负数,protobuf 的解析会变得更加困难(而且更慢)。Protobuf 不压缩字符串或浮点数,因此除非有许多小整数,否则大小相似,但 UBJ 很快,其解析器也很简单。 - cdunn2001是的: Smile 数据格式(请参见维基百科条目)具有公共的Java实现,在github上有C版本 (libsmile)。与JSON相比,它更紧凑(可靠地),但又是100%兼容逻辑数据模型,因此可以轻松地进行文本JSON之间的转换。
为了提高性能,您可以查看jvm-serializers基准测试,其中smile在与其他二进制格式(thrift、avro、protobuf)的竞争中表现良好;尺寸方面它不是最紧凑的(因为它保留字段名),但对于重复使用名称的数据流来说要好得多。
它正在被Elastic Search和Solr等项目使用(可选),Protostuff-rpc支持它,尽管它不像Thrift或protobuf那样广泛。
编辑(2011年12月)——现在还有PHP、Ruby和Python的libsmile
绑定,因此语言支持正在改善。此外,还有关于数据大小的度量;虽然对于单记录数据,替代方案(Avro、protobuf)更紧凑,但对于数据流而言,由于可以使用键和字符串值的反向引用选项,Smile通常更紧凑。
现在应该考虑的另一种选择是CBOR (RFC 7049),它具有明确的与JSON兼容的模型和很高的灵活性。它既稳定又符合您的开放标准要求,并且显然经过了很多思考。