TypeError:ObjectId('')不可序列化JSON

使用Python查询文档上的聚合函数后,我从MongoDB返回了响应,它返回有效响应,并且我可以打印该响应但不能返回它。

错误:

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调用:

@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

数据库连接良好,集合也在那里,我得到了有效的预期结果,但是当我尝试返回时,它给了我Json错误。任何想法如何将响应转换回JSON。谢谢

回答:

你应该定义自己的JSONEncoder并使用它:

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)

也可以通过以下方式使用它。

json.encode(analytics, cls=JSONEncoder)

以上是 TypeError:ObjectId('')不可序列化JSON 的全部内容, 来源链接: utcz.com/qa/423767.html

回到顶部