
本文介绍如何在 fastapi 应用中处理用户上传的 json 文件,并为其数组元素自动添加从 1 开始的整数索引键,转换为以序号为键的对象字典,便于后续按条目计算与响应。
本文介绍如何在 fastapi 应用中处理用户上传的 json 文件,并为其数组元素自动添加从 1 开始的整数索引键,转换为以序号为键的对象字典,便于后续按条目计算与响应。
在 FastAPI 中接收并处理 JSON 文件时,原始数据通常是一个列表(如 [{...}, {...}, ...]),但若需按「第 1 条」「第 2 条」等语义进行独立计算或返回结构化响应,将列表转为以递增整数为键的字典(即 {1: {...}, 2: {...}, ...})是常见且实用的做法。注意:JSON 标准规定对象的键必须为字符串,因此实际生成的是 {"1": {...}, "2": {...}, ...},而非语法上非法的 1: {...}(该写法仅用于示意)。
以下是在 FastAPI 路由中完整实现该逻辑的示例代码:
将一个或多个视频上传至YouTube。当用户想“上传到YouTube”“发YouTube”“批量上传”“upload to YouTube”“post videos to YouTube”或发布到YouTube时使用此技能。
from fastapi import FastAPI, UploadFile, File, HTTPException
import json
from typing import Dict, Any
app = FastAPI()
@app.post("/add-index-id/")
async def add_index_id(file: UploadFile = File(...)):
# 验证文件类型
if not file.filename.endswith(".json"):
raise HTTPException(400, "仅支持上传 JSON 文件")
try:
# 读取并解析上传的 JSON 内容
content = await file.read()
data = json.loads(content)
# 确保输入为 list 类型
if not isinstance(data, list):
raise HTTPException(400, "JSON 根节点必须是数组(list)")
# 构建带索引键的字典:键为字符串化的序号(从 1 开始)
indexed_data: Dict[str, Any] = {
str(index): item for index, item in enumerate(data, start=1)
}
# 可选:对每条记录执行计算(例如 B4 + B5)
results = {}
for idx, item in indexed_data.items():
b4 = item.get("B4", 0)
b5 = item.get("B5", 0)
results[idx] = {"sum_B4_B5": b4 + b5, "original": item}
return {
"status": "success",
"indexed_data": indexed_data,
"calculations": results
}
except json.JSONDecodeError:
raise HTTPException(400, "上传的文件不是有效的 JSON")
except Exception as e:
raise HTTPException(500, f"处理过程中发生错误:{str(e)}")? 关键说明与注意事项:
- FastAPI 的 UploadFile 默认以二进制方式读取,务必使用 await file.read() 并通过 json.loads() 解析,而非 json.load(f)(后者适用于文件对象,不适用于 UploadFile)。
- 原始 JSON 数组索引从 0 开始,我们使用 enumerate(..., start=1) 实现自然序号(1、2、3…)。
- 字典键必须为字符串才能合法序列化为 JSON;因此 str(index) 不可省略。
- 示例中额外演示了基于索引条目的实时计算逻辑(如字段求和),可按需扩展为统计、验证、模型推理等操作。
- 生产环境中建议增加更细粒度的字段校验(如确保每个 item 包含 "B4" 和 "B5")、超大文件流式处理及内存限制防护。
该方案无需保存中间文件,全程内存处理,高效适配 FastAPI 的异步特性,兼顾可读性与工程健壮性。

















