如何标准化JSON响应并将其转换为DataFrame?
问题描述
我正在尝试标准化JSON字符串并将其转换为DataFrame。实际工作数据属于机密内容,无法展示,以下虚构场景可说明需求:
import json import requests import pandas as pd from pandas.io.json import json_normalize # 完全无法工作... url = 'http://api.open-notify.org/iss-now.json' response = requests.get(url) text = response.text # 抛出错误 df = json_normalize(text) # 能转成列表但无法打印列名 my_list=[] my_list.append(text) print(type(my_list)) df = json_normalize(my_list) df.columns print(type(df)) df
我得到的是嵌套在列表中的字典。如何标准化JSON字符串并将其转换为标准化的DataFrame?实际JSON文件结构如下:
[{'id': '21201', 'name': 'SRW Utility, 4x4', 'latitude': 35.31068751, 'longitude': -80.66177891, 'headingDegrees': 161.2, 'speedMilesPerHour': 0}]
希望提取id、latitude、longitude等作为表头,并在表头下方以行形式展示数据。
解决方案
核心问题是你传递给json_normalize的是JSON字符串,但它需要的是Python原生的字典或列表对象。以下是正确的处理步骤:
1. 解析JSON字符串为Python对象
不管是API响应的文本还是本地JSON字符串,都需要先转换成Python可识别的字典/列表:
import json import requests import pandas as pd from pandas.io.json import json_normalize # 处理API响应的情况:直接用response.json()更简便,等价于json.loads(response.text) url = 'http://api.open-notify.org/iss-now.json' response = requests.get(url) data = response.json() # 处理实际JSON字符串场景(如果是本地读取的字符串) actual_json_str = '[{"id": "21201", "name": "SRW Utility, 4x4", "latitude": 35.31068751, "longitude": -80.66177891, "headingDegrees": 161.2, "speedMilesPerHour": 0}]' actual_data = json.loads(actual_json_str)
2. 转换为DataFrame
情况1:简单结构(如你实际的列表套字典)
对于这种无深层嵌套的结构,直接用pd.DataFrame()更简洁:
df = pd.DataFrame(actual_data) # 可选:提取指定列 df = df[['id', 'latitude', 'longitude', 'name', 'headingDegrees', 'speedMilesPerHour']] print(df.columns) print(df)
情况2:处理嵌套JSON(比如ISS API的响应)
ISS API响应是嵌套字典结构,用json_normalize可以展开嵌套字段:
df = json_normalize(data) # 可选:重命名列 df.rename(columns={'iss_position.latitude': 'latitude', 'iss_position.longitude': 'longitude'}, inplace=True) print(df)
常见错误原因
- 直接传递JSON字符串给
json_normalize:它无法解析字符串,必须是Python对象。 - 把JSON字符串添加到列表中再传递:此时列表里存的还是字符串,不是字典,依然无法解析。
内容的提问来源于stack exchange,提问作者ASH
相关产品推荐
相关产品推荐

