如何在Python中解析Cisco Prime API的JSON响应并提取dataRows到Pandas DataFrame
解决方法:定位嵌套的dataRows数组再进行扁平化处理
你遇到的问题核心是没有先定位到JSON响应中真正存储数据的dataRows数组,直接对整个顶层JSON对象使用json_normalize,自然只会得到顶层键对应的列,而内部的dataRows会被当成一个嵌套的数组列,不会展开成你需要的表格结构。
下面是具体的修复步骤和代码:
1. 先确认dataRows在JSON中的准确路径
首先你需要明确dataRows到底嵌套在顶层JSON的哪个键下面。可以在代码中添加一行,把整个JSON响应格式化打印出来,方便定位:
import json response = rq.get(url, auth=(cpi_user,cpi_password), verify=False, timeout=300) if response.status_code == rq.codes.ok: responseJSON = response.json() # 格式化打印整个JSON结构,清晰看到嵌套层级 print(json.dumps(responseJSON, indent=2))
运行后你会看到类似这样的结构(示例):
{ "reportMetadata": {...}, "reportResult": { "dataRows": [ {"apName": "RogueAP-1", "mac": "aa:bb:cc:dd:ee:ff", ...}, {"apName": "RogueAP-2", "mac": "11:22:33:44:55:66", ...} ], "summary": {...} } }
从这个示例里就能看到,dataRows是在reportResult这个顶层键的下面。
2. 提取dataRows数组并转换为DataFrame
找到路径后,修改代码先提取dataRows,再用json_normalize处理这个数组:
import pandas as pd import requests as rq def get_rogue_ap_report(url, cpi_user, cpi_password): response = rq.get(url, auth=(cpi_user,cpi_password), verify=False, timeout=300) print(response.status_code) if response.status_code == rq.codes.ok: responseJSON = response.json() # 替换成你实际找到的dataRows路径,比如下面是示例路径 data_rows = responseJSON["reportResult"]["dataRows"] # 对dataRows数组进行扁平化,自动处理内部嵌套字段 rogue_ap_df = pd.json_normalize(data_rows) print(rogue_ap_df.head(50)) return rogue_ap_df
这样处理后,rogue_ap_df就是你需要的、包含dataRows中所有字段的DataFrame了。
补充说明:
- 如果
dataRows内部还有更深的嵌套字段,json_normalize默认会用.分隔嵌套键(比如location.floor),你也可以通过sep参数自定义分隔符,比如pd.json_normalize(data_rows, sep="_")。 - 不需要用
sed或者其他第三方 flatten 库,pandas自带的json_normalize完全能处理这种场景,关键就是先拿到正确的数组对象。
内容的提问来源于stack exchange,提问作者grunklefungus
相关产品推荐
相关产品推荐

