如何将多层嵌套JSON正确转换为CSV并转回原格式上传Firebase
非单层JSON与CSV双向转换+Firebase上传实现方案
普通在线转换工具默认只会拍平JSON第一层结构,嵌套对象、数组要么丢值要么列名错位,根本无法满足双向结构一致的要求,直接用可控的本地脚本实现全流程即可,步骤如下:
1. 前置规则确认
先梳理原JSON的完整结构:
- 记录所有顶层固定字段(比如版本号、更新时间这类不属于数据列表的配置字段),后续还原时必须原封不动保留
- 嵌套字段统一用
.拼接完整层级路径作为CSV列名,比如basicInfo.contact.phone,数组字段用索引做路径后缀,比如tags.0、tags.1,禁止自动生成列名,否则后续无法还原层级
2. 环境准备
安装所需依赖:
pip install pandas firebase-admin
3. 原JSON转规范CSV
运行以下脚本生成结构固定的CSV,导出后可直接打开编辑新增数据:
import pandas as pd import json # 读取原JSON文件 with open("original_file.json", "r", encoding="utf-8") as f: raw_json = json.load(f) # 替换为你原JSON中存储数据列表的对应键,若顶层直接是数组则直接赋值给data_list data_list = raw_json if isinstance(raw_json, list) else raw_json["data_node"] # 按层级路径拍平结构 df = pd.json_normalize(data_list, sep=".") # 导出CSV,用utf-8-sig编码避免Excel打开乱码 df.to_csv("editable_structured.csv", index=False, encoding="utf-8-sig")
编辑提示:新增数据时严格对照列名的路径含义填值,数组类列按索引位顺序填写对应内容即可。
4. 编辑后CSV还原为原结构JSON
不要直接把CSV读成单层JSON导出,用递归函数还原嵌套结构,保证和原JSON层级完全一致:
import pandas as pd import json def set_nested_value(target, path_keys, value): current = target for idx, key in enumerate(path_keys[:-1]): # 识别数组索引位 if key.isdigit(): key = int(key) if len(current) <= key: current.append({}) current = current[key] else: if key not in current: current[key] = [] if path_keys[idx+1].isdigit() else {} current = current[key] # 写入最终值 last_key = path_keys[-1] if last_key.isdigit(): last_key = int(last_key) if len(current) <= last_key: current.append(value) else: current[last_key] = value else: current[last_key] = value # 读取编辑完成的CSV df = pd.read_csv("editable_structured.csv", encoding="utf-8-sig").fillna("") restored_list = [] for _, row in df.iterrows(): single_item = {} for col_name, cell_val in row.items(): if cell_val == "": continue key_path = col_name.split(".") set_nested_value(single_item, key_path, cell_val) restored_list.append(single_item) # 对照原JSON补全顶层固定字段,保证顶层结构完全一致 final_output = { # 此处补全原JSON顶层的所有非列表固定字段,比如"version": "1.0"、"updateTime": "xxx" "data_node": restored_list } # 导出还原后的JSON with open("restored_ready_upload.json", "w", encoding="utf-8") as f: json.dump(final_output, f, ensure_ascii=False, indent=2)
校验提示:导出后先拿1条存量原数据和还原后的对应数据做逐字段对比,确认嵌套层级、数组顺序完全匹配后再处理全量新增数据。
5. 上传数据到Firebase
用官方Admin SDK批量上传,避免结构错乱:
import firebase_admin from firebase_admin import credentials, firestore # 替换为你在Firebase后台下载的服务账号密钥文件路径 cred = credentials.Certificate("firebase_service_key.json") firebase_admin.initialize_app(cred) db = firestore.client() # 替换为你的目标集合名称 target_collection = db.collection("your_collection_name") batch = db.batch() for item in restored_list: # 优先用数据内的唯一ID作为文档ID,无唯一ID可调用document()自动生成 doc_ref = target_collection.document(item["id"]) if "id" in item else target_collection.document() batch.set(doc_ref, item) # 单批次最多支持500条数据,数据量超过时拆分批次提交即可 batch.commit()
注意事项
- 若原JSON存在长度不固定的数组,导出CSV时要以最长数组的长度生成列,新增数据数组长度超出现有列时,手动补对应索引列即可,避免数据丢失
- 首次上传先拿1-2条测试数据提交,在Firebase控制台确认结构和原有数据完全一致后再做全量上传
内容的提问来源于stack exchange,提问作者user18105926
相关产品推荐
相关产品推荐

