类型错误:ObjectId('') 不是 JSON 可序列化的 [英] TypeError: ObjectId('') is not JSON serializable
问题描述
我在使用 Python 查询文档上的聚合函数后从 MongoDB 返回的响应,它返回有效响应,我可以打印它但无法返回它.
My response back from MongoDB after querying an aggregated function on document using Python, It returns valid response and i can print it but can not return it.
错误:
TypeError: ObjectId('51948e86c25f4b1d1c0d303c') is not JSON serializable
打印:
{'result': [{'_id': ObjectId('51948e86c25f4b1d1c0d303c'), 'api_calls_with_key': 4, 'api_calls_per_day': 0.375, 'api_calls_total': 6, 'api_calls_without_key': 2}], 'ok': 1.0}
但是当我尝试返回时:
TypeError: ObjectId('51948e86c25f4b1d1c0d303c') is not JSON serializable
这是 RESTfull 调用:
It is RESTfull call:
@appv1.route('/v1/analytics')
def get_api_analytics():
# get handle to collections in MongoDB
statistics = sldb.statistics
objectid = ObjectId("51948e86c25f4b1d1c0d303c")
analytics = statistics.aggregate([
{'$match': {'owner': objectid}},
{'$project': {'owner': "$owner",
'api_calls_with_key': {'$cond': [{'$eq': ["$apikey", None]}, 0, 1]},
'api_calls_without_key': {'$cond': [{'$ne': ["$apikey", None]}, 0, 1]}
}},
{'$group': {'_id': "$owner",
'api_calls_with_key': {'$sum': "$api_calls_with_key"},
'api_calls_without_key': {'$sum': "$api_calls_without_key"}
}},
{'$project': {'api_calls_with_key': "$api_calls_with_key",
'api_calls_without_key': "$api_calls_without_key",
'api_calls_total': {'$add': ["$api_calls_with_key", "$api_calls_without_key"]},
'api_calls_per_day': {'$divide': [{'$add': ["$api_calls_with_key", "$api_calls_without_key"]}, {'$dayOfMonth': datetime.now()}]},
}}
])
print(analytics)
return analytics
db 连接良好,集合也在那里,我得到了有效的预期结果,但是当我尝试返回时,它给了我 Json 错误.知道如何将响应转换回 JSON.谢谢
db is well connected and collection is there too and I got back valid expected result but when i try to return it gives me Json error. Any idea how to convert the response back into JSON. Thanks
推荐答案
你应该定义你自己的 JSONEncoder
并使用它:
You should define you own JSONEncoder
and using it:
import json
from bson import ObjectId
class JSONEncoder(json.JSONEncoder):
def default(self, o):
if isinstance(o, ObjectId):
return str(o)
return json.JSONEncoder.default(self, o)
JSONEncoder().encode(analytics)
也可以通过以下方式使用.
It's also possible to use it in the following way.
json.encode(analytics, cls=JSONEncoder)
这篇关于类型错误:ObjectId('') 不是 JSON 可序列化的的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!