哪一个更轻,JSON还是BSON?

Auf*_*Auf 30 java json jackson bson

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

从我的代码Bson.class(使用杰克逊和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);
}
Run Code Online (Sandbox Code Playgroud)

从我的 Json.class

private ByteArrayOutputStream baos = new ByteArrayOutputStream();
private ObjectMapper mapper = new ObjectMapper();

public Json(Object obj) throws JsonGenerationException,
        JsonMappingException, IOException {
    mapper.writeValue(baos, obj);
}
Run Code Online (Sandbox Code Playgroud)

(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());
Run Code Online (Sandbox Code Playgroud)

输出:

Bson : 301, data : -
Json : 285, data : [{"name":"Ali Bin Baba","birthd...
Run Code Online (Sandbox Code Playgroud)

我的问题:

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

sli*_*lim 52

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


McD*_*ell 7

该属性"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
Run Code Online (Sandbox Code Playgroud)

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