为了账号安全,请及时绑定邮箱和手机立即绑定

PyMongo json_util.dumps 覆盖 ObjectId 表示

PyMongo json_util.dumps 覆盖 ObjectId 表示

温温酱 2022-06-14 17:12:12
bson.json_util提供转换为规范或宽松 JSON 格式的函数。但是,它们都坚持 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 中得到的结果不匹配。我PyMongo只是用来构建测试用例,实际的产品格式是{'_id': "ID", ..etc}我在这里查看了一些文档,以下是调查结果:CANONICAL_JSON_OPTIONS 和 RELAXED_JSON_OPTIONS 都坚持有问题的表示,规范在这里。我似乎无法覆盖它,因为uuid_representation=PYTHON_LEGACY我似乎无法找到解决方法。我是否缺少将PyMongo查询结果转换为:{'_id' : 'ID', ..}# not{'_id' : {'$oid' : 'ID'}, ..}我不想扩展我的代码只是为了处理不同格式的测试用例。
查看完整描述

2 回答

?
富国沪深

TA贡献1790条经验 获得超9个赞

这是我的做法,只使用提供的json

json.dumps(list(products.find({})), default=lambda o: str(o))


查看完整回答
反对 回复 2022-06-14
?
慕沐林林

TA贡献2016条经验 获得超9个赞

作为一种解决方法,我能够使用re正则表达式完成相同的结果:


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)

这实质上将 CANONICAL_JSON 替换为规范化的 JSON,并将键值删除为一个值。


尽管这可以完成工作,但它并不理想,因为我JSON将其作为字符串进行操作,并且非常容易出错,而且不适用于Date其他格式。


查看完整回答
反对 回复 2022-06-14
  • 2 回答
  • 0 关注
  • 193 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号