正确,jsonify()自动设Content-Type为application/json并校验类型,传入SQLAlchemy模型等不可序列化对象会报TypeError;应先转字典(如to_dict()),统一响应结构需封装api_success/api_error函数,错误状态码须作为jsonify()第二参数传入。

Flask里用jsonify()返回JSON,但别直接传原始字典
Flask的jsonify()不是简单包装json.dumps(),它会自动设置Content-Type: application/json,还会对返回值做类型校验。如果传入一个未序列化的对象(比如自定义类实例),会直接抛TypeError: Object of type XXX is not JSON serializable。
常见错误是这样写:
return jsonify({'data': user}) # user是SQLAlchemy模型实例,报错正确做法是先转成字典:
- 用
user.__dict__(注意带_sa_instance_state字段,需过滤) - 或更稳妥:定义
to_dict()方法,只返回业务字段 - 或用
sqlalchemy.orm.object_as_dict(user)(需导入sqlalchemy.orm)
需要统一响应结构时,别在每个路由里重复写{'code': 0, 'msg': '', 'data': ...}
硬编码结构容易漏字段、不一致,也难维护。推荐封装一个响应函数:
立即学习“Python免费学习笔记(深入)”;
def api_success(data=None, msg="OK", code=0):
return jsonify({'code': code, 'msg': msg, 'data': data})
<p>def api_error(msg="Error", code=500, data=None):
return jsonify({'code': code, 'msg': msg, 'data': data}), code注意两点:
-
api_error()末尾显式加, code,否则HTTP状态码仍是200 - 如果
data是None,jsonify()仍会输出"data": null,符合JSON规范,不用额外处理
遇到中文乱码或特殊字符被转义,检查JSON_AS_ASCII配置
默认Flask把非ASCII字符转成\uXXXX形式,前端看着像乱码。这不是bug,是json.dumps()的默认行为。
解决方法是在Flask应用初始化后加一行:
app.config['JSON_AS_ASCII'] = False
这个配置影响所有jsonify()调用。如果只希望某次响应不转义,得绕过jsonify(),手动构造Response:
from flask import Response
import json
return Response(json.dumps({'msg': '你好'}, ensure_ascii=False), mimetype='application/json')但没必要——全局关掉更省事,且符合国内API惯例。
不要用json.dumps() + make_response()替代jsonify()
有人为了“更灵活”手动拼JSON字符串,再套一层make_response(),结果忘了设Content-Type,前端收不到JSON解析提示,或者状态码始终是200。
jsonify()本质就是帮你做了三件事:
- 调用
json.dumps()(受JSON_AS_ASCII等配置控制) - 包装成
Response对象 - 设置
Content-Type: application/json
自己手写反而容易漏。除非你要返回非标准JSON(比如JSONP),否则没理由绕开jsonify()。
最常被忽略的是错误响应的状态码必须显式传递给jsonify(),光靠code字段没用——HTTP协议不认这个字段,前端fetch的response.status还是200。


















