Flask从Python2升级到Python3时jsonify处理字典报bytes不可序列化问题
报错原因
Python2 中str和bytes类型等价,JSON序列化时不会有类型冲突;Python3 中二者完全拆分,JSON标准仅支持Unicode字符串类型,不支持二进制bytes类型,你的data字典的键或值中存在bytes类型数据,导致序列化失败。
解决方案
方案1:全局配置Flask JSON序列化规则(代码改动最小)
无需修改现有接口返回逻辑,仅需要在Flask应用初始化位置新增自定义序列化规则,全局适配bytes类型转字符串:
from flask import Flask, json app = Flask(__name__) # 新增以下代码即可 def custom_json_serializer(obj): if isinstance(obj, bytes): # 按你实际编码调整,绝大多数场景为utf-8 return obj.decode('utf-8') raise TypeError(f"Object of type {type(obj)} is not JSON serializable") app.json.default = custom_json_serializer
方案2:单独转换目标data字典
如果不想修改全局配置,仅需要新增一个递归转换函数,修改你现有返回代码的1行即可:
# 新增转换函数 def bytes_to_str(obj): if isinstance(obj, bytes): return obj.decode('utf-8') if isinstance(obj, dict): return {bytes_to_str(k): bytes_to_str(v) for k, v in obj.items()} if isinstance(obj, (list, tuple)): return type(obj)(bytes_to_str(i) for i in obj) return obj # 你原有代码仅修改result赋值的一行 message = { 'success': True, 'result': bytes_to_str(data) } resp = jsonify(message) resp.status_code = 200 return resp
内容的提问来源于stack exchange,提问作者tony
相关产品推荐
相关产品推荐

