【问题标题】:Which one is lighter, JSON or BSON?JSON 和 BSON 哪个更轻量级?
【发布时间】:2014-07-29 16:16:01
【问题描述】:

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

【问题讨论】:

  • 我会尝试解码生成的数据。我会假设 Bson 解码速度更快,而不是更紧凑。
  • 如果你想要一个密集的格式并且使用 Java,肯定会选择协议缓冲区,它们比任何一个都更紧凑,而且速度更快,尽管它们需要一个模式。
  • 您应该更笼统地说明您的问题,例如“JSON 是否有有效的二进制表示格式”?那么你可能会得到 MessagePack (en.wikipedia.org/wiki/MessagePack) 作为答案。 BSON 实际上不是很好,无论是编码速度还是消息大小或 JSON 兼容性。 MessagePack 在所有方面都更好,但由于它的名称,它没有立即关联为二进制 JSON 格式,这是 BSON 做得更好的部分。

标签: java json jackson bson


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2013-12-12
      • 1970-01-01
      • 2013-09-28
      • 1970-01-01
      • 1970-01-01
      • 2022-01-08
      • 1970-01-01
      • 2012-05-28
      • 1970-01-01
      相关资源
      最近更新 更多