Flask 2.3.x自定义JSON编码器适配问题求助
Flask 2.3.x 适配带serializable方法的自定义对象解决方案
Flask 2.3+ 弃用了直接继承json.JSONEncoder的自定义序列化方式,改用JSONProvider作为JSON处理核心。默认的JSONProvider不会自动检测对象的serializable方法,导致原有逻辑失效,以下是修复方案:
1. 自定义JSONProvider类
继承Flask的JSONProvider,重写default方法,加入对serializable方法的检测逻辑:
from flask import Flask from flask.json.provider import JSONProvider class MyJSONProvider(JSONProvider): def default(self, obj): # 优先检测并调用对象的serializable方法 if hasattr(obj, "serializable") and callable(obj.serializable): return obj.serializable() # 未匹配时调用父类默认处理逻辑 return super().default(obj)
2. 替换应用的JSONProvider
初始化Flask应用后,将默认的JSON处理替换为自定义的MyJSONProvider:
app = Flask(__name__) app.json = MyJSONProvider(app)
3. 验证自定义对象序列化
假设你的自定义对象结构如下:
class CustomItem: def __init__(self, id, content): self.id = id self.content = content def serializable(self): return {"id": self.id, "content": self.content, "type": "CustomItem"}
在视图函数中直接返回该对象即可正常序列化:
@app.route('/demo') def demo(): item = CustomItem(1, "test content") return item
核心说明
- Flask 2.3+ 的
JSONProvider将原JSONEncoder的核心逻辑迁移到了default方法中,重写该方法即可实现自定义序列化规则。 - 需确保
serializable方法返回字典、列表等原生可JSON序列化的类型,避免嵌套不可序列化对象。
内容的提问来源于stack exchange,提问作者RobinM
相关产品推荐
相关产品推荐

