如何将 MongoDB 查询转换为 JSON?
Posted
技术标签:
【中文标题】如何将 MongoDB 查询转换为 JSON?【英文标题】:How do I turn MongoDB query into a JSON? 【发布时间】:2011-05-23 05:29:52 【问题描述】: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”不可序列化。
我该怎么办? 一个hacky的方法是循环:
for p in posts:
p['_id'] = ""
【问题讨论】:
【参考方案1】:json 模块由于 ObjectID 等原因无法工作。
幸运的是,PyMongo 提供了 json_util...
... 允许[s] 进行专门的编码和 将 BSON 文档解码为 Mongo 扩展 JSON 的严格模式。这让 您将 BSON 文档编码/解码为 JSON 即使他们使用特殊的 BSON 类型。
【讨论】:
api.mongodb.org/python/1.9%2B/installation.html & api.mongodb.org/python/1.9%2B/tutorial.html & >>> 导入pymongo 此链接已损坏。【参考方案2】:这是一个简单的示例,使用 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)
【讨论】:
json.dumps(doc, sort_keys=True, indent=4, default=json_util.default) 也解决了我的问题! 使用json_util.dumps(doc)
有什么区别?
您也应该导入 json
以使此代码正常工作,对吧?【参考方案3】:
编写处理 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)
【讨论】:
需要import bson
才能正常工作(只是提到它是因为我是新手,我花了很长时间才弄清楚)【参考方案4】:
在 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.
【讨论】:
以上是关于如何将 MongoDB 查询转换为 JSON?的主要内容,如果未能解决你的问题,请参考以下文章
TypeError:将循环结构转换为 mongodb/mongoose 的 JSON