当前位置: 首页 > 知识库问答 >
问题:

Flask PyMongo-InsertOneResult类型的对象不可JSON序列化

於功
2023-03-14

我有一个api,我正在尝试使用Flask Pymongo存储/发布一个用户对象。

但是,我得到了以下错误

文件“/home/kay/.local/share/virtualenvs/server-iT4jZt3h/lib/python3.7/site-packages/flask/json/i│ 尼特。py”,第321行,在jsonify中
│ 转储(数据,缩进=缩进,分隔符=分隔符)“\n”,│ 文件“/home/kay/.local/share/virtualenvs/server-iT4jZt3h/lib/python3.7/site-packages/flask/json/i│ 尼特。py”,第179行,转储中
│ rv=_json。倾倒区(obj,**kwargs)│ 文件“/usr/lib/python3.7/json/init.py”,第238行,转储中
│ **千瓦)。编码(obj)│ 文件“/usr/lib/python3.7/json/encoder.py”,第201行,编码
│ 块=列表(块)│ 文件“/usr/lib/python3.7/json/encoder.py”,第438行,在iterencode中│ o=_默认值(o)│ 默认情况下,文件“/home/kay/link/server/src/run.py”第18行│ 返回json。杰森编码器。默认值(self,o)│ 默认情况下,文件“/usr/lib/python3.7/json/encoder.py”第179行│ raise TypeError(类型为{o.class.name}的对象)│ TypeError:InsertOneResult类型的对象不可JSON序列化

应用程序/用户/资源。派克

from flask_restful import Resource
from flask import jsonify, request
from .repository import UsersRepository
from db import mongo


class UsersResource(Resource):

    def __init__(self):

        self.repository = UsersRepository()

    def get(self):

        data = {"Users": "Resource"}
        res = data, 200
        return res

    def post(self):

        req = request.get_json()

        user = {
            "email": req.get("email"),
            "password": req.get("password")
        }

        result = mongo.db.users.insert_one(user)

        return jsonify(result)

跑派克

from flask import Flask
from app import api_bp
from db import mongo
from bson.objectid import ObjectId
import json
import datetime
import os

class JSONEncoder(json.JSONEncoder):

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



def create_app(config_filename):

    app = Flask(__name__)
    app.config.from_object(config_filename)
    app.register_blueprint(api_bp, url_prefix='/api')

    mongo.init_app(app)

    app.json_encoder = JSONEncoder

    return app


# def logger():


# def database():


if __name__ == "__main__":
    app = create_app("config")
    app.run(host='0.0.0.0', port=8080, debug=True)

共有3个答案

耿和韵
2023-03-14

>

  • 使用pymongojson_utilbson处理BSON类型

获取json输入时使用force=true:

  • req=request.get_json(force=true)
  • req.get("email", "")

在插入mongo之前,可以检查字段是否为空。

麻学博
2023-03-14

insert_one()返回一个InsertOneResult对象,该对象包含插入的ID(如@stivane的注释所建议的)以及一个标志,该标志指示写被数据库破解了。其他操作具有类似的结果对象,并且它们都不是JSON可序列化的。

Flask PyMongo的未来版本可能会添加帮助程序来支持这一点,您可以按照https://github.com/dcrosta/flask-pymongo/issues/62添加想法和建议。

齐磊
2023-03-14

我相信按照前面的建议你可以找到答案。但我想提供另一个简化它的解决方案。

解决方案假设安装了pymongoflask包:

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()

 类似资料:
  • 我有一个看起来很常见的问题,但到目前为止,我还没有找到一个适合我的解决方案。我想我只是错过了一些小事情,但我已经崩溃了,请求帮助。我正在尝试使用flask和pymongo获得json输出。 以下是控制台中使用print(结果)的对象: 当我试图返回时,我得到了错误: TypeError: ObjectId类型的对象不是JSON可序列化的 类联系人(资源): 我试过bson。json_util建议。

  • 我正在尝试将文件从mongoDB读取到本地。 我的代码如下:STRING=“myLocalPath”PATH=STRING.json 我得到错误-对象类型'ObjectId'是不是JSON序列化...请建议。

  • 问题内容: 我使用Python Flask Restful API遇到问题,并且数据进入Elasticsearch,当我用Postman发布新数据时,问题是: TypeError:“ Response”类型的对象不可JSON序列化 你能帮助我吗? 模型: 视图: 错误: 编辑:我发现了问题。它在def post(self,people_id)方法中: 新队: 问题答案: 这可以简单地通过以下方式完

  • 我正在为我的不和谐机器人创建autovc命令,但我遇到了一些错误。代码: 错误: 文件“C:\Users\illus\AppData\Local\Programs\Python\39\lib\site packages\discord\ext\commands\core.py”,第85行,在包装的ret=await coro(*args,**kwargs)文件“d:\BOT\test.py”,第3

  • 我有以下用于序列化查询集的代码: 下面是我的 我需要将其序列化。但它说无法序列化

  • 我有一个存储店铺名称和每日销售额的数据框架。我尝试使用下面的Python脚本将其插入Salesforce。 但是,我收到以下错误: 下面,是数据框的视图。 我使用以下代码将其插入Salesforce。 当执行上面的最后一行时,我得到了错误。 我该如何解决这个问题?