【问题标题】:TypeError: Collection(Database(MongoClient("localhost", 27017), u'demo_database'), u'entries) is not JSON serializableTypeError: Collection(Database(MongoClient("localhost", 27017), u'demo_database'), u'entries) 不是 JSON 可序列化的
【发布时间】:2015-07-13 00:37:24
【问题描述】:

下午好。

我正在尝试结合 Python、MongoDB(通过 pymongo)和 Flask 来创建客户端-服务器应用程序。我想使用其中一种方法返回整个集合,如下所示:

@app.route('/entries', methods = ['GET'])
def get_entries():
    client = MongoClient(db_host, db_port)
    db_demo = client['demo_database']
    entries = db_demo.entries
    return JSONEncoder().encode(entries)

我也有一个 Encoder 类,建议 here:

class JSONEncoder(json.JSONEncoder):
    def default(self, o):
        if isinstance(o, ObjectId):
            return str(o)
        return json.JSONEncoder.default(self, o)

数据收集非常简单——实际上,只有一项很少字段。我究竟做错了什么?也许我应该开发更复杂的编码器类?

【问题讨论】:

  • 您正在尝试编码 MongoDB Collection ,将 Mongodb Cursor 或单个条目发送到您的 JSONEncoder 函数。
  • @thegreenogre,这没有帮助 - 现在它说“TypeError: 不是 JSON 可序列化的”(我现在使用 entries.find()) .
  • 对不起,我没有意识到作者正在遍历链接问题中的光标。您必须将文档发送到您的编码器方法而不是对象。如果你想返回你的集合的所有文档,遍历游标并将它们存储在本地,然后返回数组/列表。

标签: python json mongodb flask pymongo


【解决方案1】:

使用bson.json_util.dumps,它已经支持所有的MongoDB扩展JSON类型:

>>> from bson.json_util import dumps
>>> c.test.test.insert_many([{} for _ in range(3)])
<pymongo.results.InsertManyResult object at 0x7f6ed3189550>
>>> dumps(c.test.test.find())
'[{"_id": {"$oid": "554faa99fa5bd8782e1698cf"}}, {"_id": {"$oid": "554faa99fa5bd8782e1698d0"}}, {"_id": {"$oid": "554faa99fa5bd8782e1698d1"}}]'

【讨论】:

    【解决方案2】:

    结合使用这两种方法,我更喜欢我提供的解决方案here

    from flask import Flask
    from flask.json import JSONEncoder
    
    from bson import json_util
    
    from . import resources
    
    # define a custom encoder point to the json_util provided by pymongo (or its dependency bson)
    class CustomJSONEncoder(JSONEncoder):
        def default(self, obj): return json_util.default(obj)
    
    application = Flask(__name__)
    application.json_encoder = CustomJSONEncoder
    
    if __name__ == "__main__":
        application.run()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-24
      • 2016-08-02
      • 2019-02-08
      • 2013-05-11
      • 2014-08-13
      • 2019-09-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多