如何序列化Python类?Flask下SiteConfig序列化失败求代码示例
嘿,作为Python新手碰到这个JSON序列化的问题太正常啦!我给你几个简单易懂的解决方案,都是能直接跑起来的代码示例,你可以根据自己的情况选~
方法1:给自定义类添加
to_dict()方法(最直接) 这个方法的思路很简单:自己写一个方法,把类的属性转换成Python字典——而Flask的jsonify是可以直接序列化字典的。
class SiteConfig: def __init__(self, site_name, site_url, max_users): self.site_name = site_name self.site_url = site_url self.max_users = max_users # 新增这个方法,把类实例转成字典格式 def to_dict(self): return { 'site_name': self.site_name, 'site_url': self.site_url, 'max_users': self.max_users }
然后在你的Flask视图里这样调用:
from flask import Flask, jsonify app = Flask(__name__) @app.route('/site-config') def get_site_config(): # 创建SiteConfig实例 config = SiteConfig("我的Flask站点", "https://my-site.com", 200) # 调用to_dict转成字典,再用jsonify返回 return jsonify(config.to_dict()) if __name__ == '__main__': app.run(debug=True)
方法2:自定义Flask JSON编码器(自动处理)
如果你不想每次都手动调用to_dict(),可以自定义Flask的JSON编码器,让它自动识别你的SiteConfig类并处理序列化。
from flask import Flask, jsonify from flask.json import JSONEncoder class SiteConfig: def __init__(self, site_name, site_url, max_users): self.site_name = site_name self.site_url = site_url self.max_users = max_users # 自定义编码器,继承Flask默认的JSONEncoder class CustomJSONEncoder(JSONEncoder): def default(self, obj): # 如果是SiteConfig实例,就转成字典 if isinstance(obj, SiteConfig): return { 'site_name': obj.site_name, 'site_url': obj.site_url, 'max_users': obj.max_users } # 其他类型交给默认编码器处理 return super().default(obj) app = Flask(__name__) # 把自定义编码器绑定到Flask应用上 app.json_encoder = CustomJSONEncoder @app.route('/site-config') def get_site_config(): config = SiteConfig("我的Flask站点", "https://my-site.com", 200) # 直接传入实例,Flask会自动用自定义编码器处理 return jsonify(config) if __name__ == '__main__': app.run(debug=True)
方法3:用dataclass简化代码(Python 3.7+)
如果你用的是Python 3.7及以上版本,推荐用dataclass——它能帮你自动生成初始化方法,还自带转字典的工具,代码会更简洁。
from flask import Flask, jsonify from dataclasses import dataclass, asdict # 用@dataclass装饰器定义类,自动生成__init__等方法 @dataclass class SiteConfig: site_name: str site_url: str max_users: int app = Flask(__name__) @app.route('/site-config') def get_site_config(): config = SiteConfig("我的Flask站点", "https://my-site.com", 200) # 用asdict把dataclass实例转成字典 return jsonify(asdict(config)) if __name__ == '__main__': app.run(debug=True)
这三个方法都能解决你的问题,新手推荐先试方法1或者方法3,代码量少,容易理解~
内容的提问来源于stack exchange,提问作者Ratha
相关产品推荐
相关产品推荐

