¿Cuál es más ligero, JSON o BSON?


He escrito código para serializar objetos a JSON y BSON. Según mi salida, el BSON producido es mayor en tamaño que el JSON. ¿Se espera esto?

De mi código para Bson.class (usando Jackson y 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);
}

De mi 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() and toString() as above)

Mis POJOs son Person.class y Address.class.

En mi clase principal:

    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());

La salida:

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

Mi Pregunta:

  1. ¿Esa salida es verdadera, o mi código es incorrecto?
  2. ¿Alguna sugerencia para comprobar/probar, para comparar los tamaños de BSON y JSON?
Author: ST3, 2014-06-09

2 answers

De la BSON FAQ :

BSON está diseñado para ser eficiente en el espacio, pero en muchos casos no lo es mucho más eficiente que JSON. En algunos casos BSON utiliza aún más espacio que JSON. La razón de esto es otro de los objetivos de diseño de BSON: transitabilidad. BSON agrega información "extra" a los documentos, como prefijos de longitud, que hacen que sea fácil y rápido de atravesar.

BSON también está diseñado para ser rápido de codificar y decodificar. Por ejemplo, los enteros son almacenados como enteros de 32 (o 64) bits, por lo que no necesitan ser analizado hacia y desde el texto. Esto utiliza más espacio que JSON para pequeñas enteros, pero es mucho más rápido de analizar.

Para un campo de cadena, la sobrecarga en JSON es de 6 bytes 4 4 comillas, dos puntos y una coma. En BSON es 7 by tipo de entrada byte, terminador nulo a nombre de campo, longitud de cadena de 4 bytes, terminador nulo a valor.

Para un campo entero, la longitud JSON depende del tamaño del número. "1" es solo un byte. "1000000" es de 7 bytes. En BSON ambos serían un entero de 32 bits de 4 bytes. La situación con los números de coma flotante es similar.

BSON no pretende ser más pequeño. Está destinado a estar más cerca de las estructuras con las que las computadoras trabajan de forma nativa, para que se pueda trabajar con más eficiencia that ese es un significado de "luz".

Si no estás persiguiendo niveles extremos de rendimiento ( como los desarrolladores de MongoDB que diseñaron BSON), entonces te aconsejaría usar JSON the el la legibilidad humana es un gran beneficio para el desarrollador. Mientras use una biblioteca como Jackson, migrar a BSON más tarde no debería ser difícil as como puede ver por lo casi idénticas que son sus propias clases BSON y JSON.

Tenga en cuenta que si el tamaño es un problema, tanto JSON como BSON deben comprimirse bien.

 41
Author: slim,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-06-09 10:11:10

La propiedad "foo":"bar" consume 11 bytes en UTF-8 codificado JSON. En BSON consume 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

Hay muchos casos en los que JSON será más compacto.

 7
Author: McDowell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-06-09 09:04:24