Pymongo/bson:将 python.cursor.Cursor 对象转换为可序列化/JSON 对象
Posted
技术标签:
【中文标题】Pymongo/bson:将 python.cursor.Cursor 对象转换为可序列化/JSON 对象【英文标题】:Pymongo/bson: Convert python.cursor.Cursor object to serializable/JSON object 【发布时间】:2015-07-31 17:37:13 【问题描述】: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 对象?
【问题讨论】:
相关:***.com/questions/13241878/…. 将光标转换为对象列表:self.response.write(json.dumps(list(exchangedata)))
Mongo 返回一个cursor
对象,而不是实际的list
数据。正如 Kyle 所说,您需要先将其转换为 list
。
不适用于列表包装器。它通过一个空的数据对象发送。
【参考方案1】:
是的,当然你可以使用 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)
【讨论】:
【参考方案2】:简单的解决方案
// 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
【讨论】:
【参考方案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"]'
【讨论】:
此解决方案仅适用于非常小的数据集,因为它将光标获取的所有对象转储到单个字符串中。对于更大的数据,它没有帮助,您也可以遍历所有结果并保存它们。 bson 包对于大数据来说真的很糟糕。请改用 bsonjs 包。在大多数情况下,单独转换 ObjectId() 就足够了。 dumps(c.test.test.find(), indent=4) 更好。以上是关于Pymongo/bson:将 python.cursor.Cursor 对象转换为可序列化/JSON 对象的主要内容,如果未能解决你的问题,请参考以下文章