java json jackson bson

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



jackson (2)

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() y toString() como arriba)

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 verificar / probar, para comparar los tamaños de BSON y JSON?

De las preguntas frecuentes de BSON :

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

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

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

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

BSON no pretende ser más pequeño. Está pensado para estar más cerca de las estructuras con las que trabajan las computadoras de forma nativa, de modo que se pueda trabajar de manera más eficiente, es decir, un significado de "luz".

Si no está persiguiendo niveles extremos de rendimiento (como lo son los desarrolladores de MongoDB que diseñaron BSON), le aconsejaría que use JSON: la legibilidad humana es un gran beneficio para el desarrollador. Siempre que use una biblioteca como Jackson, la migración a BSON más adelante no debería ser difícil, 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 deberían comprimir bien.


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