如何通过FastAPI正确将DataFrame以JSON格式返回?
问题
我用FastAPI开发了一个返回JSON格式数据的API,最初通过Pandas的.to_json()方法将DataFrame转为JSON(指定orient="records"参数),先保存为本地.json文件再读取后返回,代码如下:
DATA2.to_json("json_records.json", orient="records") with open('json_records.json', 'r') as f: data = json.load(f) return(data)
这种方式运行正常,但由于脚本需要部署到公司服务器,不能生成本地文件,于是尝试直接转换后返回:
data = DATA2.to_json(orient="records") return(data)
此时API输出的JSON包含大量转义符\,示例如下:
"[{\"ExtraccionHora\":\"12:53:00\",\"MiembroCompensadorCodigo\":117,\"MiembroCompensadorDescripcion\":\"OMEGA CAPITAL S.A.\",\"CuentaCompensacionCodigo\":\"1143517\",\"CuentaNeteoCodigo\":\"160234117\",\"CuentaNeteoDescripcion\":\"UNION FERRO SRA A\",\"ActivoDescripcion\":\"X17F3\",\"ActivoID\":8,\"FinalidadID\":2,\"FinalidadDescripcion\":\"Margenes\",\"Cantidad\":11441952,\"Monto\":-16924935.3999999985,\"Saldo\":-11379200.0,\"IngresosVerificados\":11538288.0,\"IngresosNoVerificado\":0.0,\"MargenDelDia\":0.0,\"SaldoConsolidadoFinal\":-16765847.3999999985,\"CuentaCompensacionCodigoPropia\":\"80500\",\"SaldoCuentaPropia\":-7411284.3200000003,\"Resultado\":\"0\",\"MiembroCompensadorID\":859,\"CuentaCompensacionID\":15161,\"CuentaNeteoID\":7315285}....."
请问如何正确将DataFrame以orient="records"格式转为JSON并通过FastAPI返回?
解决方案
方法1:直接返回Python字典列表(推荐)
使用Pandas的.to_dict(orient="records")方法,直接将DataFrame转换为Python字典组成的列表。FastAPI会自动将这个列表序列化为标准JSON格式返回,无需手动处理JSON字符串:
return DATA2.to_dict(orient="records")
这种方式无需额外依赖,逻辑简洁,输出的JSON不会包含转义符。
方法2:内存中解析JSON字符串
如果一定要使用.to_json()方法,可以将生成的JSON字符串用json.loads()解析为Python对象后再返回,逻辑和你之前存文件再读取一致,只是跳过了文件存储步骤:
import json data_json_str = DATA2.to_json(orient="records") data = json.loads(data_json_str) return data
FastAPI接收Python对象后会正确序列化,避免二次转义问题。
方法3:使用JSONResponse直接返回字符串
借助FastAPI的JSONResponse类,直接传入JSON字符串并指定媒体类型,避免FastAPI对字符串进行二次序列化:
from fastapi.responses import JSONResponse data_json_str = DATA2.to_json(orient="records") return JSONResponse(content=data_json_str, media_type="application/json")
这种方式适合特殊场景,一般优先推荐前两种方法。
内容的提问来源于stack exchange,提问作者Agustin Gonzalez
相关产品推荐
相关产品推荐

