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

Flask GET请求返回JSON报错:bytes类型无法被JSON序列化

问题:Flask返回bytea类型数据时JSON序列化失败

我用Reactjs、Flask和PostgreSQL搭建网站,PostgreSQL数据库中有个url字段是bytea类型,存储的是通过psycopg2.Binary()转换后的图片数据。通过GET接口将数据以JSON格式返回给前端时,出现TypeError: Object of type bytes is not JSON serializable错误。

Flask代码(app.py)

def format_event(event):
    return {
        "name": event.name,
        "id": event.id, 
        "url" : event.url,
        "type": event.type,
        "width": event.width,
        "height": event.height
    }

#get all events
@app.route('/events', methods=['GET'])
def get_events():
    events = Event.query.order_by(Event.id.asc()).all()
    event_list = []
    for event in events:
        event_list.append(format_event(event))
    return {'events' : event_list}

报错信息

Traceback (most recent call last):
  File "C:\Users\joshu\.virtualenvs\backend-N0JzJpE8\Lib\site-packages\flask\app.py", line 1463, in wsgi_app
    response = self.full_dispatch_request()
               
  File "C:\Users\joshu\.virtualenvs\backend-N0JzJpE8\Lib\site-packages\flask\app.py", line 873, in full_dispatch_request
    return self.finalize_request(rv)
           
  File "C:\Users\joshu\.virtualenvs\backend-N0JzJpE8\Lib\site-packages\flask\app.py", line 892, in finalize_request
    response = self.make_response(rv)
              
  File "C:\Users\joshu\.virtualenvs\backend-N0JzJpE8\Lib\site-packages\flask\app.py", line 1183, in make_response
    rv = self.json.response(rv)
         
  File "C:\Users\joshu\.virtualenvs\backend-N0JzJpE8\Lib\site-packages\flask\json\provider.py", line 214, in response
    f"{self.dumps(obj, **dump_args)}\n", mimetype=self.mimetype
       
  File "C:\Users\joshu\.virtualenvs\backend-N0JzJpE8\Lib\site-packages\flask\json\provider.py", line 179, in dumps
    return json.dumps(obj, **kwargs)
           
  File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.12_3.12.752.0_x64__qbz5n2kfra8p0\Lib\json\__init__.py", line 238, in dumps
    **kw).encode(obj)
          
  File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.12_3.12.752.0_x64__qbz5n2kfra8p0\Lib\json\encoder.py", line 200, in encode
    chunks = self.iterencode(o, _one_shot=True)
             
  File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.12_3.12.752.0_x64__qbz5n2kfra8p0\Lib\json\encoder.py", line 258, in iterencode
    return _iterencode(o, 0)
           
  File "C:\Users\joshu\.virtualenvs\backend-N0JzJpE8\Lib\site-packages\flask\json\provider.py", line 121, in _default
    raise TypeError(f"Object of type {type(o).__name__} is not JSON serializable")
TypeError: Object of type bytes is not JSON serializable

解决方案

JSON不支持直接序列化bytes类型,需将bytea字段转换为Base64编码的字符串,前端可直接使用该字符串生成图片。

方法1:返回可直接使用的Data URI

修改format_event函数,将bytes转成Base64字符串并拼接为Data URI格式:

import base64

def format_event(event):
    # 将bytes类型的图片数据转成Base64字符串
    image_base64 = base64.b64encode(event.url).decode('utf-8')
    return {
        "name": event.name,
        "id": event.id, 
        "url" : f"data:{event.type};base64,{image_base64}",  # 直接生成img可用的src值
        "type": event.type,
        "width": event.width,
        "height": event.height
    }

前端使用时直接赋值给img的src:

<img src={event.url} alt={event.name} />

方法2:仅返回Base64字符串

如果希望前端自行拼接格式,可只返回Base64编码后的字符串:

import base64

def format_event(event):
    image_base64 = base64.b64encode(event.url).decode('utf-8')
    return {
        "name": event.name,
        "id": event.id, 
        "url" : image_base64,
        "type": event.type,
        "width": event.width,
        "height": event.height
    }

前端使用时自行拼接:

<img src={`data:${event.type};base64,${event.url}`} alt={event.name} />

内容的提问来源于stack exchange,提问作者JoshuaZhou

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 06:42:46