for p in db.collection.find({"test_set":"abc"}):
posts.append(p)
thejson = json.dumps({'results':posts})
return HttpResponse(thejson, mimetype="application/javascript")
在我的Django / Python代码中,由于“ObjectID”,我无法从mongo查询返回JSON。该错误表示“ObjectID”不可序列化。
我该怎么办? 一种愚蠢的方式是循环:
for p in posts:
p['_id'] = ""
答案 0 :(得分:28)
由于像ObjectID之类的东西, json 模块无效。
幸运的是,PyMongo提供了json_util ......
...允许[s]进行专门的编码和 将BSON文件解码为Mongo 扩展JSON的严格模式。这让我们 你编码/解码BSON文件 即使他们使用特殊的BSON,JSON也是如此 类型。
答案 1 :(得分:23)
这是一个简单的示例,使用pymongo 2.2.1
import os
import sys
import json
import pymongo
from bson import BSON
from bson import json_util
if __name__ == '__main__':
try:
connection = pymongo.Connection('mongodb://localhost:27017')
database = connection['mongotest']
except:
print('Error: Unable to Connect')
connection = None
if connection is not None:
database["test"].insert({'name': 'foo'})
doc = database["test"].find_one({'name': 'foo'})
return json.dumps(doc, sort_keys=True, indent=4, default=json_util.default)
答案 2 :(得分:8)
编写一个处理ObjectIds的自定义序列化程序非常容易。 Django已经包含了一个处理小数和日期的方法,所以你可以扩展它:
from django.core.serializers.json import DjangoJSONEncoder
from bson import objectid
class MongoAwareEncoder(DjangoJSONEncoder):
"""JSON encoder class that adds support for Mongo objectids."""
def default(self, o):
if isinstance(o, objectid.ObjectId):
return str(o)
else:
return super(MongoAwareEncoder, self).default(o)
现在您可以告诉json
使用自定义序列化程序:
thejson = json.dumps({'results':posts}, cls=MongoAwareEncoder)
答案 3 :(得分:5)
更简单的东西,适用于Python 3.6使用 马达== 1.1 pymongo == 3.4.0
from bson.json_util import dumps, loads
for mongo_doc in await cursor.to_list(length=10):
# mongo_doc is a <class 'dict'> returned from the async mongo driver, in this acse motor / pymongo.
# result of executing a simple find() query.
json_string = dumps(mongo_doc)
# serialize the <class 'dict'> into a <class 'str'>
back_to_dict = loads(json_string)
# to unserialize, thus return the string back to a <class 'dict'> with the original 'ObjectID' type.