在使用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
db连接良好,collection也在那里,我得到了有效的预期结果,但是当我试图返回时,它给了我Json错误。知道如何将响应转换回JSON。谢谢
来自json_util的实际示例。
与Flask的jsonify不同,“dumps”将返回一个字符串,因此不能用作Flask的jsonify的1:1替换。
但是this question显示,我们可以使用json-util.dumps()序列化,使用json.loads()转换回dict,最后调用Flask的jsonify。
示例(来自上一个问题的答案):
此解决方案将ObjectId和其他(即二进制、代码等)转换为字符串等价物,如“$oid”
JSON输出如下:
您应该定义自己的^{} 并使用它:
也可以按以下方式使用。
Pymongo提供了json_util-您可以使用它来处理BSON类型
相关问题 更多 >
编程相关推荐