# BSON BSON, short for Bin­ary JSON, is a bin­ary-en­coded seri­al­iz­a­tion of JSON-like doc­u­ments. Like JSON, BSON sup­ports the em­bed­ding of doc­u­ments and ar­rays with­in oth­er doc­u­ments and ar­rays. BSON also con­tains ex­ten­sions that al­low rep­res­ent­a­tion of data types that are not part of the JSON spec. For ex­ample, BSON has a Date type and a BinData type. !!! abstract "References" - [BSON Website](http://bsonspec.org) - the main source on BSON - [BSON Specification](http://bsonspec.org/spec.html) - the specification ## Serialization The library uses the following mapping from JSON values types to BSON types: JSON value type | value/range | BSON type | marker --------------- | --------------------------------- | ----------- | ------ null | `null` | null | 0x0A boolean | `true`, `false` | boolean | 0x08 number_integer | -9223372036854775808..-2147483649 | int64 | 0x12 number_integer | -2147483648..2147483647 | int32 | 0x10 number_integer | 2147483648..9223372036854775807 | int64 | 0x12 number_unsigned | 0..2147483647 | int32 | 0x10 number_unsigned | 2147483648..9223372036854775807 | int64 | 0x12 number_unsigned | 9223372036854775808..18446744073709551615| -- | -- number_float | *any value* | double | 0x01 string | *any value* | string | 0x02 array | *any value* | document | 0x04 object | *any value* | document | 0x03 binary | *any value* | binary | 0x05 !!! warning "Incomplete mapping" The mapping is **incomplete**, since only JSON-objects (and things contained therein) can be serialized to BSON. Also, integers larger than 9223372036854775807 cannot be serialized to BSON, and the keys may not contain U+0000, since they are serialized a zero-terminated c-strings. ??? example ```cpp --8<-- "examples/to_bson.cpp" ``` Output: ```c --8<-- "examples/to_bson.output" ``` ## Deserialization The library maps BSON record types to JSON value types as follows: BSON type | BSON marker byte | JSON value type --------------- | ---------------- | --------------------------- double | 0x01 | number_float string | 0x02 | string document | 0x03 | object array | 0x04 | array binary | 0x05 | binary undefined | 0x06 | *unsupported* ObjectId | 0x07 | *unsupported* boolean | 0x08 | boolean UTC Date-Time | 0x09 | *unsupported* null | 0x0A | null Regular Expr. | 0x0B | *unsupported* DB Pointer | 0x0C | *unsupported* JavaScript Code | 0x0D | *unsupported* Symbol | 0x0E | *unsupported* JavaScript Code | 0x0F | *unsupported* int32 | 0x10 | number_integer Timestamp | 0x11 | *unsupported* 128-bit decimal float | 0x13 | *unsupported* Max Key | 0x7F | *unsupported* Min Key | 0xFF | *unsupported* !!! warning "Incomplete mapping" The mapping is **incomplete**. The unsupported mappings are indicated in the table above. ??? example ```cpp --8<-- "examples/from_bson.cpp" ``` Output: ```json --8<-- "examples/from_bson.output" ```