You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 07:57:40