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