如何将QuickBooks返回的嵌套利润表JSON转换为Pandas DataFrame?
QuickBooks损益报告JSON转DataFrame解决方案
实现思路
QuickBooks返回的损益报告JSON采用多层嵌套的章节结构,json_normalize无法直接适配动态嵌套层级,因此采用递归遍历的方式拆解所有Row节点,同时记录每一层的父级分类路径,最终汇总为结构化表格。
完整代码实现
import pandas as pd # 递归解析嵌套Row节点 def parse_rows(rows_list, parent_categories=None): if parent_categories is None: parent_categories = [] records = [] for row in rows_list: current_level_name = None # 提取章节标题(Header字段) if "Header" in row: col_data = row["Header"]["ColData"] current_level_name = col_data[0]["value"] # 处理明细数据行 if row.get("type") == "Data": col_data = row["ColData"] record = { "分类路径": " > ".join(parent_categories), "科目名称": col_data[0]["value"], "科目ID": col_data[0].get("id"), "金额": float(col_data[1]["value"]) if col_data[1]["value"] else None, "是否汇总行": False } records.append(record) # 处理嵌套章节(Section类型) if row.get("type") == "Section": # 先提取章节汇总行 if "Summary" in row: sum_col_data = row["Summary"]["ColData"] record = { "分类路径": " > ".join(parent_categories), "科目名称": sum_col_data[0]["value"], "科目ID": None, "金额": float(sum_col_data[1]["value"]) if sum_col_data[1]["value"] else None, "是否汇总行": True } records.append(record) # 递归解析子节点,更新父级分类路径 if "Rows" in row and "Row" in row["Rows"]: new_parent = parent_categories.copy() if current_level_name: new_parent.append(current_level_name) child_records = parse_rows(row["Rows"]["Row"], new_parent) records.extend(child_records) return records # 调用示例(qb_pl_json为API返回的JSON数据变量) all_records = parse_rows(qb_pl_json["Rows"]["Row"]) df = pd.DataFrame(all_records)
输出字段说明
- 分类路径:科目所属的多级分类,示例值:
收入 > 园林绿化服务 > 工程材料 - 科目名称:具体的收入/支出科目或汇总项名称
- 科目ID:QuickBooks内科目唯一标识,汇总行无值
- 金额:对应科目的数值,已转换为浮点型
- 是否汇总行:标识当前行是否为分类合计项
可选调整
如果仅需要明细科目数据,过滤汇总行即可:
detail_df = df[df["是否汇总行"] == False].reset_index(drop=True)
内容的提问来源于stack exchange,提问作者Tabish Akhtar
相关产品推荐
相关产品推荐

