PyMongo json_util.dumps覆盖ObjectId表示形式

问题描述 投票:0回答:1

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}

我在here的文档中看了一下,这是发现的结果:

  1. [CANONICAL_JSON_OPTIONS和RELAXED_JSON_OPTIONS都坚持使用有问题的表示形式,即基于here的规范。
  2. 我似乎无法覆盖它,因为uuid_representation=PYTHON_LEGACY,而且似乎也找不到解决方法。

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

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

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

python mongodb pymongo bson
1个回答
0
投票

作为替代方案,我能够使用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当作字符串来处理,并且很容易出错,而且在Date或其他格式下也不起作用。

© www.soinside.com 2019 - 2024. All rights reserved.