BSON ( / ˈ b iː s ə n / [2] ) es un formato de intercambio de datos informáticos . El nombre "BSON" se basa en el término JSON y significa "JSON binario". [2] Es una forma binaria para representar estructuras de datos simples o complejas que incluyen matrices asociativas (también conocidas como pares nombre-valor ), matrices indexadas de números enteros y un conjunto de tipos escalares fundamentales . BSON se originó en 2009 en MongoDB . Varios tipos de datos escalares son de interés específico para MongoDB y el formato se usa tanto como formato de almacenamiento de datos como de transferencia de red para la base de datos MongoDB, pero se puede usar de forma independiente fuera de MongoDB. Las implementaciones están disponibles en una variedad de lenguajes como C , C++ , C# , D , Delphi , Erlang , Go , Haskell , Java , JavaScript , Julia , Lua , OCaml , Perl , PHP , Python , Ruby , Rust , Scala , Smalltalk y Swift . [3]
BSON tiene una especificación publicada. [4] [5] El elemento superior de la estructura debe ser del tipo objeto BSON y contener uno o más elementos, donde un elemento consta de un nombre de campo, un tipo y un valor. Los nombres de campo son cadenas. Los tipos incluyen:
true
y false
)Un diferenciador importante de JSON es que BSON contiene tipos que no están presentes en JSON (por ejemplo, datetime, byte array y floats IEEE 754 adecuados) y ofrece un manejo estricto de tipos para varios tipos numéricos en lugar de un tipo "numérico" universal. Para situaciones en las que estos tipos adicionales necesitan representarse de forma textual, se puede utilizar el formato JSON extendido de MongoDB [7] .
En comparación con JSON, BSON está diseñado para ser eficiente tanto en espacio de almacenamiento como en velocidad de escaneo. Los elementos grandes en un documento BSON tienen como prefijo un campo de longitud para facilitar el escaneo. En algunos casos, BSON utilizará más espacio que JSON debido a los prefijos de longitud y los índices de matriz explícitos. [2]
Un documento como este {"hello": "world"}
se almacenará como:
\x16\x00\x00\x00 // tamaño total del documento\x02 // 0x02 = tipo Cadenahola\x00 // nombre del campo\x06\x00\x00\x00world\x00 // valor del campo (tamaño del valor, valor, terminador nulo)\x00 // 0x00 = tipo EOO ('fin del objeto')