A library for converting between BSON and JSON.
Project description
- Info:
See github for the latest source.
About
A fast BSON to MongoDB Extended JSON converter for Python that uses libbson.
Installation
python-bsonjs can be installed with pip:
$ python -m pip install python-bsonjs
Examples
>>> import bsonjs
>>> bson_bytes = bsonjs.loads('{"hello": "world"}')
>>> bson_bytes
'\x16\x00\x00\x00\x02hello\x00\x06\x00\x00\x00world\x00\x00'
>>> bsonjs.dumps(bson_bytes)
'{ "hello" : "world" }'
Using bsonjs with pymongo to insert a RawBSONDocument.
>>> import bsonjs
>>> from pymongo import MongoClient
>>> from bson.raw_bson import RawBSONDocument
>>> client = MongoClient("localhost", 27017, document_class=RawBSONDocument)
>>> db = client.test
>>> bson_bytes = bsonjs.loads('{"_id": 1, "x": 2}')
>>> bson_bytes
'\x15\x00\x00\x00\x10_id\x00\x01\x00\x00\x00\x10x\x00\x02\x00\x00\x00\x00'
>>> result = db.test.insert_one(RawBSONDocument(bson_bytes))
>>> result.inserted_id # NOTE: inserted_id is None
>>> result.acknowledged
True
>>> raw_doc = db.test.find_one({'x': 2})
>>> raw_doc.raw == bson_bytes
True
>>> bsonjs.dumps(raw_doc.raw)
'{ "_id" : 1, "x" : 2 }'
Speed
bsonjs is roughly 10-15x faster than PyMongo’s json_util at decoding BSON to JSON and encoding JSON to BSON. See benchmark.py:
$ python benchmark.py Timing: bsonjs.dumps(b) 10000 loops, best of 3: 0.110911846161 Timing: json_util.dumps(bson.BSON(b).decode()) 10000 loops, best of 3: 1.46571397781 bsonjs is 13.22x faster than json_util Timing: bsonjs.loads(j) 10000 loops, best of 3: 0.0628039836884 Timing: bson.BSON().encode(json_util.loads(j)) 10000 loops, best of 3: 0.683200120926 bsonjs is 11.72x faster than json_util
Limitations
Top Level Arrays
Because libbson does not distinguish between top level arrays and top level documents, neither does python-bsonjs. This means that if you give dumps or dump a top level array it will give you back a dictionary. Below are two examples of this behavior
>>> import bson
>>> from bson import json_util
>>> import bsonjs
>>> bson.decode(bsonjs.loads(json_util.dumps(["a", "b", "c"])))
{'0': 'a', '1': 'b', '2': 'c'}
>>> bson.decode(bsonjs.loads(json_util.dumps([])))
{}
One potential solution to this problem is to wrap your list in a dictionary, like so
>>> list = ["a", "b", "c"]
>>> dict = {"data": list}
>>> wrapped = bson.decode(bsonjs.loads(json_util.dumps(dict)))
{'data': ['a', 'b', 'c']}
>>> wrapped["data"]
['a', 'b', 'c']
Installing From Source
python-bsonjs supports CPython 3.8+.
Compiler
You must build python-bsonjs separately for each version of Python. On Windows this means you must use the same C compiler your Python version was built with.
Windows build requires Microsoft Visual Studio 2015
Source
You can download the source using git:
$ git clone https://github.com/mongodb-labs/python-bsonjs.git
Install
Once you have the source properly downloaded, build and install the package:
$ pip install -v .
Test
To run the test suite:
$ python -m pytest
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distributions
Hashes for python_bsonjs-0.5.0-cp37-abi3-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | f5ec59aabf823fc0b27eb2fb8ee3c1d3f930fa3f3b2eb323ee1f5576f2ad6e8b |
|
MD5 | 2462a67ead351082b982c9874cfb756c |
|
BLAKE2b-256 | fc598349c74153168e7dd5b5db7ddeaf012f756fc5bec86df4cf5d127ac99a30 |
Hashes for python_bsonjs-0.5.0-cp37-abi3-win32.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | a99b85f35e112e9a7ff705644ffe7368f35ac8ce2dc883c7ae6db55b48add359 |
|
MD5 | 61c16502dfce74966d39d16050d41d26 |
|
BLAKE2b-256 | 388eced4fe65a1822c787620bc74691e93352b1b1c3f228cd7db8f9527f16581 |
Hashes for python_bsonjs-0.5.0-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 319aea1fb63f5cb4a7b374f7856486cef1efea47a5bdb9fcdeb95a310a4f14e0 |
|
MD5 | 077a3857cb1f368cc4ed88499ff57d21 |
|
BLAKE2b-256 | b0bb0d17822513e4f5aa1f9e52b779958870d5cf0d1e81f5a6c2a4c0f80cfb05 |
Hashes for python_bsonjs-0.5.0-cp37-abi3-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | fdcc6e85278d8dd251ca948e973fdcdae243d34cc07808b14d88bb5e6cc543e8 |
|
MD5 | 4a7e6c47f7929e285f504bb150ea1017 |
|
BLAKE2b-256 | 872b1b676615b1ea87536875794c13a6c443fec9b935cde51312c38c66d17466 |
Hashes for python_bsonjs-0.5.0-cp37-abi3-macosx_10_9_universal2.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 547376e278779b0918ff91183e05c3c318bfed1472e1530cddf4b4750dbcbba3 |
|
MD5 | e55b938b9b3f85c59b78adf59193bd0b |
|
BLAKE2b-256 | 5619b6a77d7e4d706606ab2320d30468603949cf04fbb413c53d5ba8e536e36d |