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 typevalue/rangeBSON typemarker
nullnullnull0x0A
booleantrue, falseboolean0x08
number_integer-9223372036854775808..-2147483649int640x12
number_integer-2147483648..2147483647int320x10
number_integer2147483648..9223372036854775807int640x12
number_unsigned0..2147483647int320x10
number_unsigned2147483648..9223372036854775807int640x12
number_unsigned9223372036854775808..18446744073709551615----
number_floatany valuedouble0x01
stringany valuestring0x02
arrayany valuedocument0x04
objectany valuedocument0x03
binaryany valuebinary0x05

!!! 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 typeBSON marker byteJSON value type
double0x01number_float
string0x02string
document0x03object
array0x04array
binary0x05binary
undefined0x06unsupported
ObjectId0x07unsupported
boolean0x08boolean
UTC Date-Time0x09unsupported
null0x0Anull
Regular Expr.0x0Bunsupported
DB Pointer0x0Cunsupported
JavaScript Code0x0Dunsupported
Symbol0x0Eunsupported
JavaScript Code0x0Funsupported
int320x10number_integer
Timestamp0x11unsupported
128-bit decimal float0x13unsupported
Max Key0x7Funsupported
Min Key0xFFunsupported

!!! 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"
```