You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将多层嵌套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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.02 06:46:04