如何将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
相关产品推荐
相关产品推荐

