You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 03:16:58