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

如何将Python flatten_json输出的扁平字典转换为固定键的记录列表

解决方案

实现思路

  • 将flatten_json输出的扁平化字典的键按下划线拆分,提取路径中的数组字段名、对应索引和最终字段名
  • 统计所有唯一的数组索引组合,每个组合对应一条输出记录
  • 遍历所有键值对,将值填充到对应索引组合的记录中,公共字段自动在所有匹配记录中重复

完整代码

def process_flattened_json(flattened_data):
    # 存储索引组合对应的记录
    records = {}
    # 存储索引组合与字段的映射关系
    field_map = {}

    for key, value in flattened_data.items():
        parts = key.split('_')
        idx_parts = []
        field_path = []
        i = 0
        # 拆分路径,区分数组字段、索引和最终字段
        while i < len(parts):
            if i + 1 < len(parts) and parts[i+1].isdigit():
                array_field = parts[i]
                array_idx = int(parts[i+1])
                idx_parts.append((array_field, array_idx))
                i += 2
            else:
                field_path.append(parts[i])
                i += 1
        final_field = '_'.join(field_path)
        idx_tuple = tuple(sorted(idx_parts))
        field_map[(idx_tuple, final_field)] = value
        # 初始化记录的索引字段
        if idx_tuple not in records:
            records[idx_tuple] = {k:v for k,v in idx_parts}
    
    # 填充所有字段到对应记录
    for (idx_tuple, field), value in field_map.items():
        records[idx_tuple][field] = value
    
    return list(records.values())

使用示例

from flatten_json import flatten

# 你的原始JSON数据
raw_data = {'recs': [{'Type': 'ACCREC', 'InvoiceID': 'e3d96555-2876-4364-a46a-7551a4f52611', 'Reference': '', 'Payments': [{'PaymentID': 'f41fd62d-48d2-4bab-975b-c770d1541014', 'Date': '/Date(1622073600000+0000)/', 'Amount': 1485.0, 'Reference': '', 'HasAccount': False, 'HasValidationErrors': False}], 'CreditNotes': [], 'AmountDue': 0.0, 'AmountPaid': 1485.0, 'AmountCredited': 0.0, 'DateString': '2021-05-14T00:00:00', 'DueDateString': '2021-05-27T00:00:00', 'Status': 'PAID', 'LineAmountTypes': 'Exclusive', 'LineItems': [{'ItemCode': 'Train-MS', 'Description': 'Half day training - Microsoft Office - for your Priority Services Team (Session 3)', 'UnitAmount': 450.0, 'TaxType': 'OUTPUT', 'TaxAmount': 45.0, 'LineAmount': 450.0, 'AccountCode': '200', 'Item': {'ItemID': '32147268-0576-46db-9c3b-adfd311035f5', 'Name': 'Half day training - Microsoft Office', 'Code': 'Train-MS'}, 'Tracking': [{'Name': 'Region', 'Option': 'South', 'TrackingCategoryID': '093af706-c2aa-4d97-a4ce-2d205a017eac', 'Options': []}], 'Quantity': 1.0, 'LineItemID': 'b45d3c74-028e-48b5-9f87-109960488e5b'}, {'ItemCode': 'Train-MS', 'Description': 'Half day training - Microsoft Office - for your Lending Service Analysts (Session 2)', 'UnitAmount': 450.0, 'TaxType': 'OUTPUT', 'TaxAmount': 45.0, 'LineAmount': 450.0, 'AccountCode': '200', 'Item': {'ItemID': '32147268-0576-46db-9c3b-adfd311035f5', 'Name': 'Half day training - Microsoft Office', 'Code': 'Train-MS'}, 'Tracking': [{'Name': 'Region', 'Option': 'South', 'TrackingCategoryID': '093af706-c2aa-4d97-a4ce-2d205a017eac', 'Options': []}], 'Quantity': 1.0, 'LineItemID': '61537ea1-d09f-4afc-84a1-2c1c7a32eb4c'}, {'ItemCode': 'Train-MS', 'Description': 'Half day training - Microsoft Office - for your Customer Support Team (Session 1)', 'UnitAmount': 450.0, 'TaxType': 'OUTPUT', 'TaxAmount': 45.0, 'LineAmount': 450.0, 'AccountCode': '200', 'Item': {'ItemID': '32147268-0576-46db-9c3b-adfd311035f5', 'Name': 'Half day training - Microsoft Office', 'Code': 'Train-MS'}, 'Tracking': [{'Name': 'Region', 'Option': 'South', 'TrackingCategoryID': '093af706-c2aa-4d97-a4ce-2d205a017eac', 'Options': []}], 'Quantity': 1.0, 'LineItemID': '71eda5c8-16eb-4204-af26-e0fe95dc5e65'}], 'SubTotal': 1350.0, 'TotalTax': 135.0, 'Total': 1485.0}]}

# 第一步:扁平化原始JSON
flattened_data = flatten(raw_data)
# 第二步:转换为固定键的多行字典列表
result = process_flattened_json(flattened_data)

特性说明

  • 自动适配任意嵌套层级的数组结构,不需要提前指定嵌套规则
  • 所有公共字段会自动在对应记录中重复填充
  • 输出的每条记录键结构完全一致,可直接导入关系型数据库

内容的提问来源于stack exchange,提问作者Akhwashah

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 04:06:01