哪一个更轻,JSON还是BSON?

我编写了将对象序列化为JSON和BSON的代码。 根据我的输出,生成的BSON的大小比JSON大。 这是预期的吗?

从我的Bson.class代码 (使用Jackson和bson4jackson)

 private ByteArrayOutputStream baos = new ByteArrayOutputStream(); private BsonFactory fac = new BsonFactory(); private ObjectMapper mapper = new ObjectMapper(fac); public Bson(Object obj) throws JsonGenerationException, JsonMappingException, IOException { mapper.writeValue(baos, obj); } public int size() { return baos.size(); } public String toString() { byte[] bytes = baos.toByteArray(); return new String(bytes); } 

来自我的Json.class

 private ByteArrayOutputStream baos = new ByteArrayOutputStream(); private ObjectMapper mapper = new ObjectMapper(); public Json(Object obj) throws JsonGenerationException, JsonMappingException, IOException { mapper.writeValue(baos, obj); } 

size()toString()如上)

我的POJO是Person.classAddress.class

在我的主要课程中:

  Address a = new Address("Jln Koli", "90121", "Vila", "Belgium"); Person p = new Person("Ali Bin Baba", new Date(), 90.0, 12, a); List persons = new LinkedList(); persons.add(p); persons.add(p); Bson bson = new Bson(persons); Json json = new Json(persons); System.out.println("Bson : " + bson.size() + ", data : " + bson.toString()); System.out.println("Json : " + json.size() + ", data : " + json.toString()); 

输出:

 Bson : 301, data : - Json : 285, data : [{"name":"Ali Bin Baba","birthd... 

我的问题:

  1. 这个输出是真的,还是我的代码错了?
  2. 有关检查/测试,比较BSON和JSON大小的建议吗?

从BSON FAQ :

BSON旨在提高空间效率,但在许多情况下并不比JSON更有效。 在某些情况下,BSON使用比JSON更多的空间。 其原因是另一个BSON设计目标:可穿越性。 BSON为文档添加了一些“额外”信息,如长度前缀,使得遍历变得简单快捷。

BSON还可以快速编码和解码。 例如,整数存储为32(或64)位整数,因此不需要对文本进行解析。 对于小整数,这使用比JSON更多的空间,但解析起来要快得多。

对于字符串字段,JSON中的开销是6个字节 – 4个引号,冒号和逗号。 在BSON中,它是7 – 条目类型字节,字段名称的空终止符,4字节字符串长度,值终止符号。

对于整数字段,JSON长度取决于数字的大小。 “1”只是一个字节。 “1000000”是7个字节。 在BSON中,这两者都是4字节32位整数。 浮点数的情况类似。

BSON并不打算缩小规模。 它旨在更接近计算机本机工作的结构,以便可以更有效地工作 – 这是“轻”的一个含义。

如果你没有追求极端的性能水平(正如设计BSON的MongoDB开发人员那样),那么我建议使用JSON – 人类可读性对开发人员来说是一个很大的好处。 只要您使用像Jackson这样的库,稍后迁移到BSON应该不会很难 – 正如您可以看到您自己的BSON和JSON类几乎相同。

请记住,如果大小是一个问题,JSON和BSON都应该很好地压缩。

属性"foo":"bar"以UTF-8编码的JSON消耗11个字节。 在BSON中消耗13:

 bytes description ============================================ 1 entry type value \x02 3 "foo" 1 NUL \x00 4 int32 string length (4 -- includes the NUL) 3 "bar" 1 NUL \x00 

在许多情况下,JSON将更加紧凑。