Pymongo/bson: преобразовать объект python.cursor.Cursor в объект сериализуемый/JSON

Новое в MongoDb и Python (webapp2). Итак, я получал некоторые данные из базы данных mongodb. Но я не смог использовать json.dumps для возвращаемых данных. Вот мой код:

exchangedata = db.Stock_Master.find({"Country": "PHILIPPINES"}, {"_id" : 0})        
self.response.write(json.dumps(exchangedata)) 

Это вызывает ошибку:

TypeError: pymongo.cursor.Cursor object at 0x7fcd51230290 is not JSON serializable

Тип exchangedatapymongo.cursor.Cursor. Как я могу преобразовать его в объект json?


person Tarun Dugar    schedule 19.05.2015    source источник
comment
Связано: stackoverflow.com/questions/13241878/.   -  person alecxe    schedule 19.05.2015
comment
Преобразовать курсор в список объектов: self.response.write(json.dumps(list(exchangedata)))   -  person Monkpit    schedule 19.05.2015
comment
Mongo возвращает cursor объект вместо фактического list данных. Вам нужно будет сначала преобразовать это в list, как упомянул Кайл.   -  person Martin Konecny    schedule 19.05.2015
comment
Не работает с оберткой списка. Он отправляет пустой объект данных.   -  person Tarun Dugar    schedule 20.05.2015


Ответы (3)


Используйте дампы из bson.json_util:

>>> c = pymongo.MongoClient()
>>> c.test.test.count()
5
>>> from bson.json_util import dumps
>>> dumps(c.test.test.find())
'[{"_id": {"$oid": "555cb3a7fa5bd85b81d5a624"}}, {"_id": {"$oid": "555cb3a7fa5bd85b81d5a625"}}, {"_id": {"$oid": "555cb3a7fa5bd85b81d5a626"}}, {"_id": {"$oid": "555cb3a7fa5bd85b81d5a627"}}, {"_id": {"$oid": "555cb3a7fa5bd85b81d5a628"}}]'
person Bernie Hackett    schedule 22.05.2015
comment
это решение хорошо только для очень небольшого набора данных, поскольку оно выводит все объекты, выбранные курсором, в одну строку. С большими данными это не помогает, и вы также можете перебрать все результаты и просто сохранить их. - person hashark; 22.11.2018
comment
Пакет bson действительно плох для больших данных. Вместо этого используйте пакет bsonjs. В большинстве случаев вам должно быть достаточно преобразовать только ObjectId(). - person XChikuX; 28.11.2018
comment
dumps(c.test.test.find(), indent=4) лучше. - person Evan; 11.01.2021

Простое решение

 // Use dumps from bson.json_util:
from bson.json_util import dumps

@app.route("/")
def home_page():

    booking = dumps(mongo.db.bookings.find())
    print booking
    return  booking
person Shashwat Gupta    schedule 06.10.2018

Да, конечно, вы можете использовать dumps() в пакете bson.json_util. Но dumps() даст вам цитируемые результаты. Чтобы получить четкий результат json, вы можете использовать следующий код.

clean_json = re.compile('ISODate\(("[^"]+")\)').sub('\\1', 
        dumps(my_db._my_collection.find(query), 
                 json_options=CANONICAL_JSON_OPTIONS))
json_obj = json.loads(clean_json)
person Shirantha Madusanka    schedule 27.03.2020