json_util
– Tools for using Python’s json
module with BSON documents¶
Tools for using Python’s json
module with BSON documents.
This module provides two helper methods dumps and loads that wrap the
native json
methods and provide explicit BSON conversion to and from
JSON. JSONOptions
provides a way to control how JSON
is emitted and parsed, with the default being the Relaxed Extended JSON format.
json_util
can also generate Canonical or legacy Extended JSON
when CANONICAL_JSON_OPTIONS
or LEGACY_JSON_OPTIONS
is
provided, respectively.
Example usage (deserialization):
>>> from bson.json_util import loads
>>> loads('[{"foo": [1, 2]}, {"bar": {"hello": "world"}}, {"code": {"$scope": {}, "$code": "function x() { return 1; }"}}, {"bin": {"$type": "80", "$binary": "AQIDBA=="}}]')
[{'foo': [1, 2]}, {'bar': {'hello': 'world'}}, {'code': Code('function x() { return 1; }', {})}, {'bin': Binary(b'...', 128)}]
Example usage with RELAXED_JSON_OPTIONS
(the default):
>>> from bson import Binary, Code
>>> from bson.json_util import dumps
>>> dumps([{'foo': [1, 2]},
... {'bar': {'hello': 'world'}},
... {'code': Code("function x() { return 1; }")},
... {'bin': Binary(b"")}])
'[{"foo": [1, 2]}, {"bar": {"hello": "world"}}, {"code": {"$code": "function x() { return 1; }"}}, {"bin": {"$binary": {"base64": "AQIDBA==", "subType": "00"}}}]'
Example usage (with CANONICAL_JSON_OPTIONS
):
>>> from bson import Binary, Code
>>> from bson.json_util import dumps, CANONICAL_JSON_OPTIONS
>>> dumps([{'foo': [1, 2]},
... {'bar': {'hello': 'world'}},
... {'code': Code("function x() { return 1; }")},
... {'bin': Binary(b"")}],
... json_options=CANONICAL_JSON_OPTIONS)
'[{"foo": [{"$numberInt": "1"}, {"$numberInt": "2"}]}, {"bar": {"hello": "world"}}, {"code": {"$code": "function x() { return 1; }"}}, {"bin": {"$binary": {"base64": "AQIDBA==", "subType": "00"}}}]'
Example usage (with LEGACY_JSON_OPTIONS
):
>>> from bson import Binary, Code
>>> from bson.json_util import dumps, LEGACY_JSON_OPTIONS
>>> dumps([{'foo': [1, 2]},
... {'bar': {'hello': 'world'}},
... {'code': Code("function x() { return 1; }", {})},
... {'bin': Binary(b"")}],
... json_options=LEGACY_JSON_OPTIONS)
'[{"foo": [1, 2]}, {"bar": {"hello": "world"}}, {"code": {"$code": "function x() { return 1; }", "$scope": {}}}, {"bin": {"$binary": "AQIDBA==", "$type": "00"}}]'
Alternatively, you can manually pass the default to json.dumps()
.
It won’t handle Binary
and Code
instances (as they are extended strings you can’t provide custom defaults),
but it will be faster as there is less recursion.
Note
If your application does not need the flexibility offered by
JSONOptions
and spends a large amount of time in the json_util
module, look to
python-bsonjs for a nice
performance improvement. python-bsonjs is a fast BSON to MongoDB
Extended JSON converter for Python built on top of
libbson. python-bsonjs works best
with PyMongo when using RawBSONDocument
.
- class bson.json_util.DatetimeRepresentation¶
- LEGACY = 0¶
Legacy MongoDB Extended JSON datetime representation.
datetime.datetime
instances will be encoded to JSON in the format {“$date”: <dateAsMilliseconds>}, where dateAsMilliseconds is a 64-bit signed integer giving the number of milliseconds since the Unix epoch UTC. This was the default encoding before PyMongo version 3.4.New in version 3.4.
- NUMBERLONG = 1¶
NumberLong datetime representation.
datetime.datetime
instances will be encoded to JSON in the format {“$date”: {“$numberLong”: “<dateAsMilliseconds>”}}, where dateAsMilliseconds is the string representation of a 64-bit signed integer giving the number of milliseconds since the Unix epoch UTC.New in version 3.4.
- ISO8601 = 2¶
ISO-8601 datetime representation.
datetime.datetime
instances greater than or equal to the Unix epoch UTC will be encoded to JSON in the format {“$date”: “<ISO-8601>”}.datetime.datetime
instances before the Unix epoch UTC will be encoded as if the datetime representation isNUMBERLONG
.New in version 3.4.
- class bson.json_util.JSONMode¶
- LEGACY = 0¶
Legacy Extended JSON representation.
In this mode,
dumps()
produces PyMongo’s legacy non-standard JSON output. Consider usingRELAXED
orCANONICAL
instead.New in version 3.5.
- RELAXED = 1¶
Relaxed Extended JSON representation.
In this mode,
dumps()
produces Relaxed Extended JSON, a mostly JSON-like format. Consider using this for things like a web API, where one is sending a document (or a projection of a document) that only uses ordinary JSON type primitives. In particular, theint
,Int64
, andfloat
numeric types are represented in the native JSON number format. This output is also the most human readable and is useful for debugging and documentation.See also
The specification for Relaxed Extended JSON.
New in version 3.5.
- CANONICAL = 2¶
Canonical Extended JSON representation.
In this mode,
dumps()
produces Canonical Extended JSON, a type preserving format. Consider using this for things like testing, where one has to precisely specify expected types in JSON. In particular, theint
,Int64
, andfloat
numeric types are encoded with type wrappers.See also
The specification for Canonical Extended JSON.
New in version 3.5.
- class bson.json_util.JSONOptions(strict_number_long: Optional[bool] = None, datetime_representation: Optional[int] = None, strict_uuid: Optional[bool] = None, json_mode: int = 1, *args: Any, **kwargs: Any)¶
Create new instance of _BaseCodecOptions(document_class, tz_aware, uuid_representation, unicode_decode_error_handler, tzinfo, type_registry, datetime_conversion)
- with_options(**kwargs: Any) bson.json_util.JSONOptions ¶
Make a copy of this JSONOptions, overriding some options:
>>> from bson.json_util import CANONICAL_JSON_OPTIONS >>> CANONICAL_JSON_OPTIONS.tz_aware True >>> json_options = CANONICAL_JSON_OPTIONS.with_options(tz_aware=False, tzinfo=None) >>> json_options.tz_aware False
New in version 3.12.
- bson.json_util.LEGACY_JSON_OPTIONS: bson.json_util.JSONOptions = JSONOptions(strict_number_long=False, datetime_representation=0, strict_uuid=False, json_mode=0, document_class=dict, tz_aware=False, uuid_representation=UuidRepresentation.UNSPECIFIED, unicode_decode_error_handler='strict', tzinfo=None, type_registry=TypeRegistry(type_codecs=[], fallback_encoder=None), datetime_conversion=DatetimeConversion.DATETIME)¶
JSONOptions
for encoding to PyMongo’s legacy JSON format.See also
The documentation for
bson.json_util.JSONMode.LEGACY
.New in version 3.5.
- bson.json_util.CANONICAL_JSON_OPTIONS: bson.json_util.JSONOptions = JSONOptions(strict_number_long=True, datetime_representation=1, strict_uuid=True, json_mode=2, document_class=dict, tz_aware=False, uuid_representation=UuidRepresentation.UNSPECIFIED, unicode_decode_error_handler='strict', tzinfo=None, type_registry=TypeRegistry(type_codecs=[], fallback_encoder=None), datetime_conversion=DatetimeConversion.DATETIME)¶
JSONOptions
for Canonical Extended JSON.See also
The documentation for
bson.json_util.JSONMode.CANONICAL
.New in version 3.5.
- bson.json_util.RELAXED_JSON_OPTIONS: bson.json_util.JSONOptions = JSONOptions(strict_number_long=False, datetime_representation=2, strict_uuid=True, json_mode=1, document_class=dict, tz_aware=False, uuid_representation=UuidRepresentation.UNSPECIFIED, unicode_decode_error_handler='strict', tzinfo=None, type_registry=TypeRegistry(type_codecs=[], fallback_encoder=None), datetime_conversion=DatetimeConversion.DATETIME)¶
JSONOptions
for Relaxed Extended JSON.See also
The documentation for
bson.json_util.JSONMode.RELAXED
.New in version 3.5.
- bson.json_util.DEFAULT_JSON_OPTIONS: bson.json_util.JSONOptions = JSONOptions(strict_number_long=False, datetime_representation=2, strict_uuid=True, json_mode=1, document_class=dict, tz_aware=False, uuid_representation=UuidRepresentation.UNSPECIFIED, unicode_decode_error_handler='strict', tzinfo=None, type_registry=TypeRegistry(type_codecs=[], fallback_encoder=None), datetime_conversion=DatetimeConversion.DATETIME)¶
The default
JSONOptions
for JSON encoding/decoding.The same as
RELAXED_JSON_OPTIONS
.Changed in version 4.0: Changed from
LEGACY_JSON_OPTIONS
toRELAXED_JSON_OPTIONS
.New in version 3.4.
- bson.json_util.dumps(obj: Any, *args: Any, **kwargs: Any) str ¶
Helper function that wraps
json.dumps()
.Recursive function that handles all BSON types including
Binary
andCode
.- Parameters
json_options: A
JSONOptions
instance used to modify the encoding of MongoDB Extended JSON types. Defaults toDEFAULT_JSON_OPTIONS
.
Changed in version 4.0: Now outputs MongoDB Relaxed Extended JSON by default (using
DEFAULT_JSON_OPTIONS
).Changed in version 3.4: Accepts optional parameter json_options. See
JSONOptions
.
- bson.json_util.loads(s: str, *args: Any, **kwargs: Any) Any ¶
Helper function that wraps
json.loads()
.Automatically passes the object_hook for BSON type conversion.
Raises
TypeError
,ValueError
,KeyError
, orInvalidId
on invalid MongoDB Extended JSON.- Parameters
json_options: A
JSONOptions
instance used to modify the decoding of MongoDB Extended JSON types. Defaults toDEFAULT_JSON_OPTIONS
.
Changed in version 4.0: Now loads
datetime.datetime
instances as naive by default. To load timezone aware instances utilize the json_options parameter. See tz_aware defaults to False for an example.Changed in version 3.5: Parses Relaxed and Canonical Extended JSON as well as PyMongo’s legacy format. Now raises
TypeError
orValueError
when parsing JSON type wrappers with values of the wrong type or any extra keys.Changed in version 3.4: Accepts optional parameter json_options. See
JSONOptions
.
- bson.json_util.object_pairs_hook(pairs: Sequence[Tuple[str, Any]], json_options: bson.json_util.JSONOptions = JSONOptions(strict_number_long=False, datetime_representation=2, strict_uuid=True, json_mode=1, document_class=dict, tz_aware=False, uuid_representation=UuidRepresentation.UNSPECIFIED, unicode_decode_error_handler='strict', tzinfo=None, type_registry=TypeRegistry(type_codecs=[], fallback_encoder=None), datetime_conversion=DatetimeConversion.DATETIME)) Any ¶
- bson.json_util.object_hook(dct: Mapping[str, Any], json_options: bson.json_util.JSONOptions = JSONOptions(strict_number_long=False, datetime_representation=2, strict_uuid=True, json_mode=1, document_class=dict, tz_aware=False, uuid_representation=UuidRepresentation.UNSPECIFIED, unicode_decode_error_handler='strict', tzinfo=None, type_registry=TypeRegistry(type_codecs=[], fallback_encoder=None), datetime_conversion=DatetimeConversion.DATETIME)) Any ¶
- bson.json_util.default(obj: Any, json_options: bson.json_util.JSONOptions = JSONOptions(strict_number_long=False, datetime_representation=2, strict_uuid=True, json_mode=1, document_class=dict, tz_aware=False, uuid_representation=UuidRepresentation.UNSPECIFIED, unicode_decode_error_handler='strict', tzinfo=None, type_registry=TypeRegistry(type_codecs=[], fallback_encoder=None), datetime_conversion=DatetimeConversion.DATETIME)) Any ¶