如何将MongoDB查询转换为JSON?
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代码中,我无法从MongoDB查询中返回JSON,因为出现了“ObjectID”的问题。错误提示说“ObjectID”无法被序列化。
我该怎么做呢?一种比较简单的方法是通过循环来处理:
for p in posts:
p['_id'] = ""
4 个回答
9
写一个自定义的序列化器来处理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)
27
这里有一个简单的示例,使用的是 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)