python type_error ai_generated true

TypeError: Object of type Product is not JSON serializable

ID: python/flask-jsonify-non-serializable-object

Also available as: JSON · Markdown · 中文
80%Fix Rate
85%Confidence
0Evidence
2024-03-15First Seen

Version Compatibility

VersionStatusIntroducedDeprecatedNotes
3.x active

Root Cause

在 Flask 的 JSON 响应中直接返回了自定义对象(如 ORM 模型),而 Flask 默认的 JSON 编码器无法处理非基本类型。

generic

中文

在 Flask 的 JSON 响应中直接返回了自定义对象(如 ORM 模型),而 Flask 默认的 JSON 编码器无法处理非基本类型。

Workarounds

  1. 95% success
    class CustomJSONEncoder(JSONEncoder):
        def default(self, obj):
            if isinstance(obj, Product):
                return {'id': obj.id, 'name': obj.name}
            return super().default(obj)
    app.json_encoder = CustomJSONEncoder
  2. 90% success
    from marshmallow import Schema, fields
    class ProductSchema(Schema):
        id = fields.Int()
        name = fields.Str()
    product_schema = ProductSchema()
    return product_schema.dump(product)

Dead Ends

Common approaches that don't work:

  1. 70% fail

    虽然可以避免报错,但输出的 JSON 是对象的字符串表示,丢失了字段结构,前端无法使用。

  2. 90% fail

    json.dumps 同样无法处理自定义对象,会抛出相同的 TypeError,即使使用 default 参数也很难正确处理复杂模型。

  3. 60% fail

    如果对象包含关联对象或日期时间等类型,手动转换容易遗漏或出错,导致后续序列化失败或数据不完整。