Python实现嵌套JSON转Excel:自定义列顺序排列数据
解决方案
1. 先明确字段分组
先把所有字段按需求分成三类:
- 主字段:对应A到W列的23个核心发票信息(如
invoice_id、customer_name、invoice_date等) - DETAILS字段:嵌套在
DETAILS节点下的明细字段(如item、qty、amount等) - PAYMENTS字段:嵌套在
PAYMENTS节点下的付款字段(如pay_method、pay_amount、pay_date等)
2. 正确展开嵌套数据
根据你的JSON结构选择对应方式展开:
场景1:DETAILS与PAYMENTS一一对应(每条明细对应一笔付款)
直接通过json_normalize同时展开两个嵌套节点,确保行对齐:
import pandas as pd import json # 加载JSON数据 with open("invoices.json", "r", encoding="utf-8") as f: invoice_data = json.load(f) # 展开嵌套数据,保留主字段并区分DETAILS/PAYMENTS字段 df = pd.json_normalize( invoice_data, record_path=["DETAILS"], meta=[ # 按顺序列出所有主字段(A-W列) "invoice_id", "customer_name", "invoice_date", ..., # 关联PAYMENTS字段,添加前缀避免重名 ["PAYMENTS", "pay_method"], ["PAYMENTS", "pay_amount"], ["PAYMENTS", "pay_date"] ], record_prefix="DETAILS_" )
场景2:DETAILS与PAYMENTS为独立数组(一个发票有多条明细/多笔付款)
分开展开后按发票ID关联合并:
# 展开主表+DETAILS df_details = pd.json_normalize( invoice_data, record_path=["DETAILS"], meta=["invoice_id", ...] # 主字段列表 ) # 展开主表+PAYMENTS df_payments = pd.json_normalize( invoice_data, record_path=["PAYMENTS"], meta=["invoice_id"] ) # 按发票ID合并(若有更精准的关联逻辑,可添加额外关联字段) df_combined = pd.merge(df_details, df_payments, on="invoice_id", how="left")
3. 手动指定列顺序
无论哪种展开方式,最后强制按需求排列列:
# 严格按顺序定义列:主字段 → DETAILS字段 → PAYMENTS字段 column_order = [ # 主字段(A-W列,按你需要的顺序排列) "invoice_id", "customer_name", "invoice_date", ..., # DETAILS字段(W列之后的字段) "DETAILS_item", "DETAILS_qty", "DETAILS_amount", ..., # PAYMENTS字段(DETAILS之后的字段) "PAYMENTS_pay_method", "PAYMENTS_pay_amount", "PAYMENTS_pay_date", ... ] # 重排列并导出Excel df = df[column_order] df.to_excel("formatted_invoices.xlsx", index=False)
关键注意事项
- 主字段需严格按你需要的A-W列顺序列出,确保数量为23个
- 若
DETAILS/PAYMENTS是单个对象而非数组,直接用pd.json_normalize(invoice_data)展开,无需record_path参数 - 一对多场景下,需明确明细与付款的关联规则(如金额匹配、顺序匹配),避免数据错位
内容的提问来源于stack exchange,提问作者Eyup
相关产品推荐
相关产品推荐

