PyMongo json_util.dumps 覆盖 ObjectId 表示

bson.json_util提供转换为规范或宽松 JSON 格式的函数。但是,它们都坚持 ObjectId 的相同表示:


from PyMongo import MongoClient

from bson.objectid import ObjectId

from bson import json_util

from bson.json_util import RELAXED_JSON_OPTIONS

from bson.json_util import CANONICAL_JSON_OPTIONS, DEFAULT_JSON_OPTIONS



db = 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 中得到的结果不匹配。我PyMongo只是用来构建测试用例,实际的产品格式是


{'_id': "ID", ..etc}

我在这里查看了一些文档,以下是调查结果:


CANONICAL_JSON_OPTIONS 和 RELAXED_JSON_OPTIONS 都坚持有问题的表示,规范在这里。

我似乎无法覆盖它,因为uuid_representation=PYTHON_LEGACY我似乎无法找到解决方法。

我是否缺少将PyMongo查询结果转换为:


{'_id' : 'ID', ..}

# not

{'_id' : {'$oid' : 'ID'}, ..}

我不想扩展我的代码只是为了处理不同格式的测试用例。


温温酱
浏览 194回答 2
2回答

富国沪深

这是我的做法,只使用提供的json库json.dumps(list(products.find({})), default=lambda o: str(o))

慕沐林林

作为一种解决方法,我能够使用re正则表达式完成相同的结果:import redef 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 stringstring = json_dumps(mongo_query_result)string = remove_oid(string)这实质上将 CANONICAL_JSON 替换为规范化的 JSON,并将键值删除为一个值。尽管这可以完成工作,但它并不理想,因为我JSON将其作为字符串进行操作,并且非常容易出错,而且不适用于Date其他格式。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python