bson.json_util提供轉(zhuǎn)換為規(guī)范或?qū)捤?JSON 格式的函數(shù)。但是,它們都堅持 ObjectId 的相同表示:from PyMongo import MongoClientfrom bson.objectid import ObjectIdfrom bson import json_utilfrom bson.json_util import RELAXED_JSON_OPTIONSfrom bson.json_util import CANONICAL_JSON_OPTIONS, DEFAULT_JSON_OPTIONSdb = MongoClient(URL)['DB_NAME']mongo_query_result = db.collection.find_one({'_id': ObjectId('ID')}, {'_id': 1})# returns {'_id': ObjectId('ID')}print(json_util.dumps(mongo_query_result, json_options=RELAXED_JSON_OPTIONS))print(json_util.dumps(mongo_query_result, json_options=CANONICAL_JSON_OPTIONS))print(json_util.dumps(mongo_query_result, json_options=DEFAULT_JSON_OPTIONS))# Results{"_id": {"$oid": "ID"}}{"_id": {"$oid": "ID"}}{"_id": {"$oid": "ID"}}# Desired Output{"_id": "ID"}問題在于它與我在 prod env 中得到的結(jié)果不匹配。我PyMongo只是用來構(gòu)建測試用例,實際的產(chǎn)品格式是{'_id': "ID", ..etc}我在這里查看了一些文檔,以下是調(diào)查結(jié)果:CANONICAL_JSON_OPTIONS 和 RELAXED_JSON_OPTIONS 都堅持有問題的表示,規(guī)范在這里。我似乎無法覆蓋它,因為uuid_representation=PYTHON_LEGACY我似乎無法找到解決方法。我是否缺少將PyMongo查詢結(jié)果轉(zhuǎn)換為:{'_id' : 'ID', ..}# not{'_id' : {'$oid' : 'ID'}, ..}我不想擴展我的代碼只是為了處理不同格式的測試用例。
2 回答

富國滬深
TA貢獻1790條經(jīng)驗 獲得超9個贊
這是我的做法,只使用提供的json
庫
json.dumps(list(products.find({})), default=lambda o: str(o))

慕沐林林
TA貢獻2016條經(jīng)驗 獲得超9個贊
作為一種解決方法,我能夠使用re正則表達式完成相同的結(jié)果:
import re
def remove_oid(string):
while True:
pattern = re.compile('{\s*"\$oid":\s*(\"[a-z0-9]{1,}\")\s*}')
match = re.search(pattern, string)
if match:
string = string.replace(match.group(0), match.group(1))
else:
return string
string = json_dumps(mongo_query_result)
string = remove_oid(string)
這實質(zhì)上將 CANONICAL_JSON 替換為規(guī)范化的 JSON,并將鍵值刪除為一個值。
盡管這可以完成工作,但它并不理想,因為我JSON將其作為字符串進行操作,并且非常容易出錯,而且不適用于Date其他格式。
添加回答
舉報
0/150
提交
取消