
本文介绍如何在 fastapi 应用中接收用户上传的 json 文件,并为其数组元素动态添加从 1 开始的整数索引键,转换为以序号为键的字典结构,便于后续按索引进行独立计算与结果展示。
本文介绍如何在 fastapi 应用中接收用户上传的 json 文件,并为其数组元素动态添加从 1 开始的整数索引键,转换为以序号为键的字典结构,便于后续按索引进行独立计算与结果展示。
在 FastAPI 中处理上传的 JSON 文件时,原始数据通常是一个列表(如 [{"B4": 14, "B5": 12}, ...]),但若需按“第1组”“第2组”等语义化方式访问每条记录(例如分别计算 B4 + B5 或做归一化),将列表转为以递增整数为键的字典(如 {"1": {...}, "2": {...}})是更直观、易索引的设计。
以下是一个完整、可直接集成到 FastAPI 服务中的实现方案:
✅ 步骤说明
- 接收用户通过 UploadFile 上传的 JSON 文件;
- 解析 JSON 内容,确保其为合法列表;
- 使用 enumerate(..., start=1) 为每个对象分配从 1 开始的字符串键(JSON 键必须为字符串);
- 构建新字典并序列化为 JSON 响应(或保存为文件)。
? 示例代码(FastAPI 路由)
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": {...}, "2": {...}, ...}
indexed_data: Dict[str, Any] = {
str(idx): item for idx, item in enumerate(data, start=1)
}
return {"status": "success", "indexed_data": indexed_data}
except json.JSONDecodeError:
raise HTTPException(400, "上传的文件不是有效的 JSON")
except Exception as e:
raise HTTPException(500, f"处理失败:{str(e)}")
? 注意事项
- JSON 标准不支持数字作为对象键(如 1: {...} 是非法语法),因此索引必须转为字符串(如 "1": {...}),上述代码已自动处理;
- 若需持久化保存(如写入磁盘),可在路由内使用 with open("updated.json", "w") as f: json.dump(indexed_data, f, indent=2);
- 对于大文件,建议流式解析或添加内存限制,避免 await file.read() 导致 OOM;
- 可进一步扩展:添加校验逻辑(如确保每个 item 包含 "B4" 和 "B5" 字段)、支持嵌套结构或返回计算结果(如 "result_1": {"sum": 26, "ratio": 1.166})。
该方案轻量、健壮,完美适配 FastAPI 的异步文件处理范式,让索引化 JSON 成为可复用的数据预处理环节。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!










