哪一个是更轻的,JSON还是BSON?

2022-09-01 05:07:08

我已经编写了将对象序列化为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<Person> 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大小的建议?

答案 1

来自 BSON 常见问题解答

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都应该很好地压缩。


答案 2

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

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 会更加紧凑。