Flask JSON
Flask 的 JSON 模块提供了序列化/反序列化功能,底层默认使用 Python 标准库 json,可通过 JSONProvider 替换。
导入方式:
from flask import jsonify
或
from flask.json import dumps, loads
jsonify 函数
最常用的 JSON 响应构建函数。将 Python 对象序列化为 JSON Response。
| 用法 | 说明 |
|---|---|
| jsonify(*args, **kwargs) | 将参数序列化为 JSON,返回 Response(Content-Type: application/json) |
| jsonify(dict) | 序列化字典为 JSON 响应 |
| jsonify(key=value, ...) | 序列化关键字参数为 JSON 响应 |
dumps / loads / dump / load
| 函数 | 签名 | 说明 |
|---|---|---|
| dumps | (obj, *, skipkeys=False, ensure_ascii=True, ...) | 将 Python 对象序列化为 JSON 字符串 |
| loads | (s, *, ...) | 将 JSON 字符串反序列化为 Python 对象 |
| dump | (obj, fp, *, ...) | 将 Python 对象序列化并写入文件 |
| load | (fp, *, ...) | 从文件读取并反序列化 JSON |
JSONProvider 类
可自定义的 JSON 处理器基类。要替换默认 JSON 实现,继承此类并覆盖相关方法。
| 方法 | 说明 |
|---|---|
| dumps(obj, **kwargs) | 序列化对象为 JSON 字符串 |
| loads(s, **kwargs) | 从 JSON 字符串反序列化为 Python 对象 |
| response(obj) | 将对象转换为 JSON Response。用于 jsonify 和返回 dict/list 时 |
DefaultJSONProvider
默认的 JSONProvider 实现,基于 Python 标准库 json。
| 属性/方法 | 说明 |
|---|---|
| ensure_ascii | 是否转义非 ASCII 字符。可设为 False 支持中文输出 |
| sort_keys | 是否按 key 排序输出。默认为 True |
| compact | 是否紧凑输出(无空格)。默认为 False |
JSON Tag 序列化
flask.json.tag 模块支持序列化更多 Python 类型,如 datetime、tuple、set 等。
| 标签 | 对应的 Python 类型 |
|---|---|
| JSONTaggedJSONSerializer | 增强版序列化器,Session 默认使用。支持带标签的 JSON 格式 |
代码示例
实例
from flask import Flask, jsonify
app = Flask(__name__)
@app.get("/api/me")
def me():
# 返回 dict,Flask 自动调用 jsonify
return {
"username": "runoob",
"email": "test@runoob.com",
"roles": ["admin", "editor"]
}
@app.get("/api/users")
def users():
# 返回 list,Flask 自动调用 jsonify
return [
{"id": 1, "name": "runoob"},
{"id": 2, "name": "admin"}
]
@app.get("/api/status")
def status():
# 显式使用 jsonify
return jsonify(status="ok", version="1.0")
# 配置中文 JSON 输出
app.json.ensure_ascii = False
# {"username": "runoob", "description": "中文描述内容"}
app = Flask(__name__)
@app.get("/api/me")
def me():
# 返回 dict,Flask 自动调用 jsonify
return {
"username": "runoob",
"email": "test@runoob.com",
"roles": ["admin", "editor"]
}
@app.get("/api/users")
def users():
# 返回 list,Flask 自动调用 jsonify
return [
{"id": 1, "name": "runoob"},
{"id": 2, "name": "admin"}
]
@app.get("/api/status")
def status():
# 显式使用 jsonify
return jsonify(status="ok", version="1.0")
# 配置中文 JSON 输出
app.json.ensure_ascii = False
# {"username": "runoob", "description": "中文描述内容"}
