使用 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。