Pymongo / bson:将python.cursor.Cursor对象转换为serializable / JSON对象

时间:2015-05-19 18:23:55

标签: python json mongodb pymongo webapp2

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

exchangedata的类型为pymongo.cursor.Cursor。如何将其转换为json对象?

3 个答案:

答案 0 :(得分:24)

使用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"}}]'

答案 1 :(得分:1)

  

简单解决方案

 // 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

答案 2 :(得分:0)

是的,您当然可以在bson.json_util包中使用dumps()。但是,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)