【问题标题】:<Object id> is not JSON serializable<Object id> 不是 JSON 可序列化的
【发布时间】:2018-02-01 10:21:27
【问题描述】:

我正在用 python + Flask + marshmallow 创建一个 API。 这是类+第一个函数(我还没有使用其他函数)

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)

我使用 Postman 和这个 json 请求测试了 add_User 函数:

{

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

}

我得到了这个错误:

TypeError: <User 145> is not JSON serializable

【问题讨论】:

    标签: python database api flask marshmallow


    【解决方案1】:

    用户有自己的自动生成 ID user.id,即 ObjectId。 您需要自定义 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)
    

    现在尝试拨打return json_response(new_user, cls=MongoJsonEncoder)

    【讨论】:

    • 实际上,您的标题具有误导性。它说&lt;Object id&gt; is not JSON serializable,然后是TypeError: &lt;User 145&gt; is not JSON serializable。您正在将用户对象传递给 jsonify,但它接受字典等值。首先,您需要将用户 obj 转换为字典。试试return jsonify(name=new_user.name)
    • 它正在工作!!!!很好,但我不明白你在说我无法对对象进行 jsonify 处理的字典?
    • 这取决于对象。对象之间有很大的不同,一个函数不能满足所有对象。
    • 谢谢,@Alk。将对象转换为 dict 对我有用。返回 jsonify(name=new_user.name)
    猜你喜欢
    • 2016-08-02
    • 1970-01-01
    • 2015-09-19
    • 1970-01-01
    • 2017-08-13
    • 2018-04-19
    • 1970-01-01
    • 1970-01-01
    • 2015-10-02
    相关资源
    最近更新 更多