如何评估JSON内容结构并将嵌套JSON正确转换为带表头的DataFrame?
问题
已查阅相关讨论帖,但使用其中方法仍遇到问题。
执行以下代码获取JSON数据:
import json import requests import pandas as pd url1 = "https://chronicdata.cdc.gov/views/iw6q-r3ja/rows.json" content = requests.get(url1) d = content.json() print(d.keys())
得到输出:
dict_keys(['meta', 'data'])
但使用pd.DataFrame(d['data'])或urlopen获取数据后转换的代码,得到的DataFrame字段异常且无表头。
对JSON使用经验较少,不清楚需使用哪些函数参数。希望掌握未来高效处理此类问题的方法:在浏览器中打开完整下载链接能看到清晰的结构,但不确定这是否能帮助解析JSON。
部分实时更新数据仅提供JSON格式,希望掌握高效处理方法,不像使用CSV链接:
url2 = "https://data.cdc.gov/api/views/iw6q-r3ja/rows.csv" df = pd.read_csv(url2)
那样能直接得到带表头的DataFrame。
疑问:
- 获取JSON后如何最佳评估其结构?
- 能否编写代码以正确读取表头,且在数据源更新时仍能适配列结构?
解决方案
一、评估JSON结构的方法
- 先确认顶层结构:打印
d.keys()明确顶层键,这类开放数据的JSON通常meta存元数据(表头、字段规则),data存实际业务记录。 - 深挖元数据细节:用
pprint模块格式化输出d['meta'],重点定位字段定义模块(比如columns字段),这是表头的核心来源。示例代码:
from pprint import pprint pprint(d['meta']['view']['columns'])
- 抽样验证数据对应关系:取
d['data']的前1-2条记录,确认每条数据的字段顺序和meta中columns的顺序是否匹配:
print(d['data'][0])
- 浏览器辅助可视化:直接在浏览器打开JSON链接,利用浏览器自带的JSON格式化功能,能直观看到层级关系,快速定位元数据和业务数据的位置。
二、编写适配性强的解析代码
这类开放平台的JSON结构通常具备固定规则:meta.view.columns存储表头信息,data存储按顺序排列的记录。通过提取columns中的name作为表头,再将data转换为DataFrame,即可实现自动适配列结构的需求:
import requests import pandas as pd from pprint import pprint url = "https://chronicdata.cdc.gov/views/iw6q-r3ja/rows.json" response = requests.get(url) data_dict = response.json() # 从元数据中提取表头:取columns数组里的name字段 headers = [col['name'] for col in data_dict['meta']['view']['columns']] # 将业务数据转换为DataFrame并指定表头 df = pd.DataFrame(data_dict['data'], columns=headers) # 查看转换结果 print(df.head())
该代码的优势是:只要数据源的顶层结构(meta.view.columns和data)不变,即使后续新增、修改列,代码也能自动适配新的表头和列结构,无需手动调整。
内容的提问来源于stack exchange,提问作者Naeblis
相关产品推荐
相关产品推荐

