使用 json util

json_util 提供了两个辅助方法 dumpsloads,它们包装了原生的 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_OPTIONSSTRICT_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>) 

要使用不同的选项,你可以:

  1. 修改 DEFAULT_JSON_OPTIONS 对象。在这种情况下,选项将用于对 dumps 的所有后续调用:

     from bson.json_util import DEFAULT_JSON_OPTIONS
     DEFAULT_JSON_OPTIONS.datetime_representation = 2
     dumps(record)
    
  2. 使用 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_classloads() 返回的 BSON 文档将被解码为该类的实例。必须是 collections.MutableMapping 的子类。默认为 dict。
  • uuid_representation :在编码和解码 uuid.UUID 实例时使用的 BSON 表示。默认为 PYTHON_LEGACY。
  • tz_aware :如果为 true,MongoDB Extended JSON 的 Strict 模式类型 Date 将被解码为 datetime.datetime 的时区感知实例。否则他们就会天真。默认为 True。
  • tzinfodatetime.tzinfo 子类,指定应解码日期时间对象的时区。默认为 utc。