如何扁平化嵌套JSON以适配SQL上传?Python代码求助
完全扁平化嵌套JSON适配SQL上传的Python解决方案
你原来的json_normalize调用只处理了顶层结构,没对in_network里的多层嵌套列表做展开。要实现完全扁平化,得逐层解析嵌套的列表和字典,把所有字段拆成独立列。下面是优化后的代码:
import json import pandas as pd # 加载JSON数据 with open('new_test.json', 'r') as f: data = json.load(f) # 第一步:展开最外层的in_network列表,保留顶层元数据字段 df = pd.json_normalize( data, record_path='in_network', meta=[ 'reporting_entity_name', 'reporting_entity_type', 'plan_name', 'plan_id_type', 'plan_id', 'plan_market_type', 'last_updated_on', 'version' ] ) # 第二步:展开negotiated_rates列表并解析内部字典 df = df.explode('negotiated_rates').reset_index(drop=True) df = pd.concat([df.drop('negotiated_rates', axis=1), pd.json_normalize(df['negotiated_rates'])], axis=1) # 第三步:展开provider_groups列表并解析内部字典 df = df.explode('provider_groups').reset_index(drop=True) df = pd.concat([df.drop('provider_groups', axis=1), pd.json_normalize(df['provider_groups'])], axis=1) # 处理npi列表:转成字符串(适配SQL存储,避免数组类型问题) df['npi'] = df['npi'].apply(lambda x: ','.join(map(str, x))) # 第四步:展开tin字典为独立列 df = pd.concat([df.drop('tin', axis=1), pd.json_normalize(df['tin'])], axis=1) # 第五步:展开negotiated_prices列表并解析内部字典 df = df.explode('negotiated_prices').reset_index(drop=True) df = pd.concat([df.drop('negotiated_prices', axis=1), pd.json_normalize(df['negotiated_prices'])], axis=1) # 查看扁平化后的结果 print(df.columns)
关键步骤说明
- 用
json_normalize的record_path参数指定要展开的列表字段,meta保留顶层的非列表字段,确保每条记录都关联原始的元数据。 - 对每层嵌套的列表(
negotiated_rates、provider_groups、negotiated_prices),先用explode把列表拆成多行,再用json_normalize解析里面的字典,合并到原DataFrame。 - 把
npi列表转成字符串,因为大部分SQL数据库不直接支持数组类型,这样更适配上传需求。 - 对嵌套的字典(比如
tin),直接用json_normalize拆成独立列。
运行后,所有字段都会变成类似negotiation_arrangement、negotiated_rate这样的独立列,完全没有嵌套结构,直接可以导入SQL数据库。
内容的提问来源于stack exchange,提问作者BARE BEAR
相关产品推荐
相关产品推荐

