java - JSON 和 BSON 哪个更轻量级?

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

来 self 的 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);
}

来 self 的 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 的大小?

最佳答案

来自 BSON FAQ :

BSON is designed to be efficient in space, but in many cases is not much more efficient than JSON. In some cases BSON uses even more space than JSON. The reason for this is another of the BSON design goals: traversability. BSON adds some "extra" information to documents, like length prefixes, that make it easy and fast to traverse.

BSON is also designed to be fast to encode and decode. For example, integers are stored as 32 (or 64) bit integers, so they don't need to be parsed to and from text. This uses more space than JSON for small integers, but is much faster to parse.

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

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

BSON 并不打算更小。它旨在更接近计算机原生使用的结构,以便可以更有效地使用它——这就是“光”的一种含义。

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

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

https://stackoverflow.com/questions/24114932/

相关文章:

java - JSON 对象中值的顺序是否重要?

.net - JSON.NET JsonConvert 与 .NET JavaScriptSeria

javascript - Rails 中奇怪的 JSON Javascript 问题

json - 在 JSON 中序列化 base64 编码的数据

c# - 如何使JSON.NET忽略对象关系?

java - 使用 jackson JsonNodeFactory 的最佳方式

java - 反序列化时忽略属性

json - 使用 Elasticsearch 搜索多个字段

php - 如何使用 PHP 更新/编辑 JSON 文件

javascript - 列表/数组是有效的 JSON 吗?