导读:本期聚焦于小伙伴创作的《Flask-SQLAlchemy ORM对象如何序列化才能避免"Object of type User is not JSON serializable"错误》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《Flask-SQLAlchemy ORM对象如何序列化才能避免"Object of type User is not JSON serializable"错误》有用,将其分享出去将是对创作者最好的鼓励。

在Flask项目中使用Flask-SQLAlchemy操作数据库时,我们经常会需要把查询到的ORM对象返回给前端,这时候如果直接调用jsonify或者json.dumps方法,就会遇到Object of type User is not JSON serializable这类错误。这是因为Python原生的JSON序列化器只支持基础数据类型,无法处理自定义的ORM对象,接下来我们就逐一介绍可用的解决方案。

Flask-SQLAlchemy ORM对象如何序列化才能避免Object of type User is not JSON serializable错误

方案一:手动提取属性转字典

这是最基础的解决方式,直接把ORM对象的属性提取出来组成字典,再对字典进行JSON序列化,适合属性较少、结构简单的ORM对象。

from flask import Flask, jsonify
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///test.db'
db = SQLAlchemy(app)

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(50))
    age = db.Column(db.Integer)

@app.route('/user_manual')
def get_user_manual():
    user = User.query.first()
    # 手动提取属性组成字典
    user_dict = {
        'id': user.id,
        'username': user.username,
        'age': user.age
    }
    return jsonify(user_dict)

方案二:自定义JSON编码器

如果项目中ORM对象较多,手动提取属性的方式会非常繁琐,这时候可以自定义Flask的JSON编码器,统一处理ORM对象的序列化逻辑。

from flask import Flask, jsonify
from flask_sqlalchemy import SQLAlchemy
from flask.json import JSONEncoder

class CustomJSONEncoder(JSONEncoder):
    def default(self, obj):
        # 判断是否为Flask-SQLAlchemy的Model实例
        if isinstance(obj, db.Model):
            # 获取对象的所有列属性,排除私有属性
            columns = [column.name for column in obj.__table__.columns]
            result = {}
            for column in columns:
                value = getattr(obj, column)
                result[column] = value
            return result
        # 其他类型交给父类处理
        return super().default(obj)

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///test.db'
app.json_encoder = CustomJSONEncoder
db = SQLAlchemy(app)

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(50))
    age = db.Column(db.Integer)

@app.route('/user_encoder')
def get_user_encoder():
    user = User.query.first()
    # 现在可以直接传入ORM对象,编码器会自动处理
    return jsonify(user)

方案三:使用marshmallow库序列化

当ORM对象关系复杂、需要处理嵌套对象或者字段校验时,手动提取和自定义编码器的方式都不够灵活,这时候可以使用专业的序列化库marshmallow。

from flask import Flask, jsonify
from flask_sqlalchemy import SQLAlchemy
from marshmallow import Schema, fields

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///test.db'
db = SQLAlchemy(app)

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(50))
    age = db.Column(db.Integer)

# 定义User对应的序列化Schema
class UserSchema(Schema):
    id = fields.Integer()
    username = fields.String()
    age = fields.Integer()

user_schema = UserSchema()

@app.route('/user_marshmallow')
def get_user_marshmallow():
    user = User.query.first()
    # 使用schema序列化对象,返回字典
    user_data = user_schema.dump(user)
    return jsonify(user_data)

方案对比与选择建议

我们可以通过下面的表格对比三种方案的特点,根据实际场景选择:

方案适用场景优点缺点
手动提取属性ORM对象属性少、结构简单,临时使用实现简单,无额外依赖重复工作多,对象属性变化时需同步修改代码
自定义JSON编码器项目中ORM对象多,无复杂嵌套关系一次配置全局生效,无需每个接口单独处理对嵌套对象、特殊字段处理不够灵活
marshmallow库对象关系复杂、需要字段校验、多场景序列化功能强大,支持嵌套、校验、自定义字段处理需要额外安装依赖,配置稍复杂

在实际开发中,如果项目规模较小,手动提取属性或者自定义编码器就足够使用;如果是中大型项目,尤其是涉及复杂对象关系和接口校验的场景,更推荐使用marshmallow库,能够在长期维护中减少很多重复工作。

Flask-SQLAlchemyORM_serializationJSON_serializablePython_web修改时间:2026-05-28 21:43:13

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。