在使用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
这是一个完整的电话:
@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。谢啦
>>> from bson import Binary, Code
>>> from bson.json_util import dumps
>>> dumps([{'foo': [1, 2]},
... {'bar': {'hello': 'world'}},
... {'code': Code("function x() { return 1; }")},
... {'bin': Binary("")}])
'[{"foo": [1, 2]}, {"bar": {"hello": "world"}}, {"code": {"$code": "function x() { return 1; }", "$scope": {}}}, {"bin": {"$binary": "AQIDBA==", "$type": "00"}}]'
来自json_util的实际示例。
与Flask的jsonify不同,“转储”将返回一个字符串,因此它不能用作Flask jsonify的1:1替换。
但是这个问题表明,我们可以使用json_util.dumps()进行序列化,使用json.loads()转换回来,最后调用Flask的jsonify。
示例(源自上一个问题的答案):
from bson import json_util, ObjectId
import json
#Lets create some dummy document to prove it will work
page = {'foo': ObjectId(), 'bar': [ObjectId(), ObjectId()]}
#Dump loaded BSON to valid JSON string and reload it as dict
page_sanitized = json.loads(json_util.dumps(page))
return page_sanitized
此解决方案将ObjectId和其他(即二进制、代码等)转换为字符串等价物,如“$oid”
JSON输出看起来像这样:
{
"_id": {
"$oid": "abc123"
}
}
您应该定义自己的jsonecoder
并使用它:
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)
Pymongo提供了json_util——您可以使用它来处理BSON类型
def parse_json(data):
return json.loads(json_util.dumps(data))
问题内容: 我有以下用于序列化查询集的代码; 以下是我的 我需要序列化。但是它说无法序列化。因为列表由Django对象和字典组成。有任何想法吗 ? 问题答案: 并且不能很好地与Django对象配合使用。 Django的内置序列化器只能序列化由django对象填充的查询集: 在您的情况下,其中包含django对象和dict的混合。 一种选择是摆脱中的模型实例,并使用dict将其替换为: 希望有帮助。
问题内容: 在使用Python查询文档上的聚合函数后,我从MongoDB返回了响应,它返回有效响应,我可以打印该响应但不能返回它。 错误: 打印: 但是当我尝试返回时: 这是RESTfull调用: 数据库连接良好,集合也在那里,我得到了有效的预期结果,但是当我尝试返回时,它给了我Json错误。任何想法如何将响应转换回JSON。谢谢 问题答案: 您应该定义自己并使用它: 也可以按以下方式使用它。
问题内容: 我正在尝试以JSON形式发送POST请求。 *电子邮件变量的类型为“字节” 我得到错误: 您能告诉我我做错了什么吗? 问题答案: 发生这种情况是因为您要在dict中(特别是)传递一个对象,可能是作为的值。您需要先将其解码为一个对象,然后才能使用它:
问题内容: 创建NumPy数组并将其另存为Django上下文变量后,加载网页时出现以下错误: 这是什么意思? 问题答案: 我定期“ jsonify” np.arrays。尝试首先在数组上使用“ .tolist()”方法,如下所示: 为了“ unjsonify”数组使用:
我在Python中有一个类,用于检索表中的所有列,并返回包含此数据的JSON。 问题是这些列中至少有一列是datetime,我似乎不知道如何序列化这些列以便生成有效的JSON。 我的班级如下: 有什么线索吗?
我有以下用于序列化查询集的代码: 下面是我的 我需要将其序列化。但它说无法序列化