将Pymongo光标转换为JSON


  • 我知道这是一个相当普遍的问题。我正在写一个小烧瓶应用程序,并且正在尝试将一些查询送回视图。我已经连接到本地的MongoDB设置,并进行了成功的查询 - 但是我无法使用它生成JSON对象。

我看到的最常见的解决方案是从pymongo导入json_util,即

import json
from pymongo import json_util
results = connection.get_collection('papayas_papaya')
results = results.find({
    'identifier': '1',
})
serialized_results = [json.dumps(result, default=json_util.default, separators=(',', ':')) for result in results]

我已经使用pip将pymongo安装到烧瓶Virtualenv中:

pip install pymongo

运行上述代码时,我会继续遇到以下错误:

ImportError: cannot import name json_util

我可以在pymongo-2.3-py2.6.egg-info/inporthed-files.txt中看到此行 ../bson/json_util.py

有人有任何技巧可以帮助我弄清楚我做错了什么?

更新:对此进行了进一步的努力 - 我设法使此工作正常工作:

import pymongo
from bson.json_util import dumps
connection = pymongo.Connection("localhost", 27017)
db = connection.mydocs
def get():
    cursor = db.foo.find({"name" : "bar"})
    return dumps(cursor)

我遇到的问题之一是试图独立地安装BSON -Pymongo带来了BSON,并分别导入BSON引起了问题。

感谢@cagex对我的指向正确的方向

看起来您想从Bson而不是Pymongo导入。我相信JSON_UTIL最近被移至该模块。https://pymongo.readthedocs.io/en/stable/api/bbson/json_util.html

我已经看到了很多关于这个问题的帖子,但他们并没有解决这个问题。对我有用的是使用 dumps(),然后 loads()

import pymongo
from bson.json_util import dumps
from bson.json_util import loads
    
connection = pymongo.Connection("localhost", 27017)
db = connection.mydocs
    
def get():
    cursor = db.foo.find({"name" : "bar"})
    return loads(dumps(cursor))

您可以使用list()将pymongo光标转换为json对象。

import pymongo
from bson.json_util import dumps
from bson.json_util import loads
connection = pymongo.Connection("localhost", 27017)
db = connection.mydocs
def get():
   cursor = list(db.foo.find({"name" : "bar"}))
   return loads(dumps(cursor))

您首先需要定义自己的JSONEncoder

import json
from datetime import datetime
from typing import Any
from bson import ObjectId

class MongoJSONEncoder(json.JSONEncoder):
    def default(self, o: Any) -> Any:
        if isinstance(o, ObjectId):
            return str(o)
        if isinstance(o, datetime):
            return str(o)
        return json.JSONEncoder.default(self, o)

然后使用它来编码mongo光标:

data_json = MongoJSONEncoder().encode(list(cursor))

然后,您可以用json.loads()加载作为Python对象:

data_obj = json.loads(data_json)