使用 json util
json_util 提供了两个辅助方法 dumps
和 loads
,它们包装了原生的 json 方法,并提供了与 json 之间的显式 BSON 转换。
简单的用法
from bson.json_util import loads, dumps
record = db.movies.find_one()
json_str = dumps(record)
record2 = loads(json_str)
如果 record
是:
{
"_id" : ObjectId("5692a15524de1e0ce2dfcfa3"),
"title" : "Toy Story 4",
"released" : ISODate("2010-06-18T04:00:00Z")
}
然后 json_str
成为:
{
"_id": {"$oid": "5692a15524de1e0ce2dfcfa3"},
"title" : "Toy Story 4",
"released": {"$date": 1276833600000}
}
JSONOptions
可以通过 JSONOptions
对象自定义 dumps
的行为。已有两套选项:DEFAULT_JSON_OPTIONS
和 STRICT_JSON_OPTIONS
。
>>> bson.json_util.DEFAULT_JSON_OPTIONS
JSONOptions(strict_number_long=False, datetime_representation=0,
strict_uuid=False, document_class=dict, tz_aware=True,
uuid_representation=PYTHON_LEGACY, unicode_decode_error_handler='strict',
tzinfo=<bson.tz_util.FixedOffset object at 0x7fc168a773d0>)
要使用不同的选项,你可以:
-
修改
DEFAULT_JSON_OPTIONS
对象。在这种情况下,选项将用于对dumps
的所有后续调用:from bson.json_util import DEFAULT_JSON_OPTIONS DEFAULT_JSON_OPTIONS.datetime_representation = 2 dumps(record)
-
使用
json_options
参数在dumps
的调用中指定JSONOptions
:# using strict dumps(record, json_options=bson.json_util.STRICT_JSON_OPTIONS) # using a custom set of options from bson.json_util import JSONOptions options = JSONOptions() # options is a copy of DEFAULT_JSON_OPTIONS options.datetime_representation=2 dumps(record, json_options=options)
JSONOptions
的参数是:
- strict_number_long :如果为 true,则 Int64 对象被编码为 MongoDB Extended JSON 的严格模式类型 NumberLong,即
{"$numberLong": "<number>" }
。否则它们将被编码为 int。默认为 False。 - datetime_representation :编码 datetime.datetime 实例时使用的表示形式。0 =>
{"$date": <dateAsMilliseconds>}
,1 =>{"$date": {"$numberLong": "<dateAsMilliseconds>"}}
,2 =>{"$date": "<ISO-8601>"}
- strict_uuid :如果为 true,则将 uuid.UUID 对象编码为 MongoDB Extended JSON 的 Strict 模式类型 Binary。否则它将被编码为
{"$uuid": "<hex>" }
。默认为 False。 - document_class :
loads()
返回的 BSON 文档将被解码为该类的实例。必须是 collections.MutableMapping 的子类。默认为 dict。 - uuid_representation :在编码和解码 uuid.UUID 实例时使用的 BSON 表示。默认为 PYTHON_LEGACY。
- tz_aware :如果为 true,MongoDB Extended JSON 的 Strict 模式类型 Date 将被解码为 datetime.datetime 的时区感知实例。否则他们就会天真。默认为 True。
- tzinfo :
datetime.tzinfo
子类,指定应解码日期时间对象的时区。默认为 utc。