简体   繁体   English

<Object id>不可序列化为JSON

[英]<Object id> is not JSON serializable

i'm creating an API in python + Flask + marshmallow. 我正在python + Flask +棉花糖中创建一个API。 Here's the class + the first function (i don't already use the others ) 这是类+第一个函数(我尚未使用其他函数)

import datetime
from marshmallow import Schema, fields, ValidationError, pre_load
from flask import Flask, jsonify
from flask_marshmallow import Marshmallow
from flask_sqlalchemy import SQLAlchemy
from flask import request
import os


app = Flask(__name__)
basedir = os.path.abspath(os.path.dirname(__file__))
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + os.path.join(basedir, 'User.sqlite')
# Order matters: Initialize SQLAlchemy before Marshmallow
db = SQLAlchemy(app)
ma = Marshmallow(app)





class User(db.Model):
    userid = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(30))
    badgenum = db.Column(db.String(30))
    mail = db.Column(db.String(30))
    status = db.Column(db.String(30))
    admin = db.Column(db.String(30))

    def __init__(self, userid, name, badgenum, mail, status, admin):
        self.userid = userid
        self.name = name
        self.badgenum = badgenum
        self.mail = mail
        self.status = status
        self.admin = admin


class UserSchema(ma.Schema):
    class Meta:
        fields = ('userid', 'name', 'badgenum', 'mail', 'status', 'admin')


user_schema = UserSchema()
users_schema = UserSchema(many=True)


@app.route("/User", methods=["POST"])
def add_User():
    userid = request.json['userid']
    name = request.json['name']
    badgenum = request.json['badgenum']
    mail = request.json['mail']
    status = request.json['status']
    admin = request.json['admin']


    new_user = User(userid, name, badgenum, mail, status, admin)

    db.session.add(new_user)
    db.session.commit()

    return jsonify(new_user)

I tested the function add_User using Postman with this json request : 我使用带有json请求的Postman测试了功能add_User:

{

    "userid" : 1,
    "name" : "name1",
    "badgenum" : "66897",
    "mail" : "ghh@orange.fr",
    "status" : "on",
    "admin" : "f"

}

and i got this error: 我得到了这个错误:

TypeError: <User 145> is not JSON serializable

User has its own autogenerated id user.id which is ObjectId. 用户具有自己的自动生成的ID user.id ,即ObjectId。 You need custom json encoder to encode ObjectId field. 您需要自定义json编码器来编码ObjectId字段。

import json, bson

def json_response(obj, cls=None):
    response = make_response(json.dumps(obj, cls=cls))
    response.content_type = 'application/json'

    return response

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

        return json.JSONEncoder.default(self, obj)

Now try to call return json_response(new_user, cls=MongoJsonEncoder) 现在尝试调用return json_response(new_user, cls=MongoJsonEncoder)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM