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

网络工程师求助:如何从API响应中提取dstprefix字段?

问题:从API响应中提取"dstprefix"字段

背景

我是一名网络工程师,刚接触软件开发,基础问题还请包涵。现在想从API调用的响应里提取特定字段dstprefix,目前遇到了瓶颈,希望能了解原理而非直接要答案。

API响应示例

>>> print(response.json)
[{u'dstprefix': u'166.70.0.0/16', u'bits': 744091635, u'split1': {u'start': u'2023-09-27T18:14:00.000Z', u'end': u'2023-09-27T18:15:00Z', u'type': u'TIME_RANGE'}}, {u'dstprefix': u'67.2.0.0/16', u'bits': 478661859, u'split1': {u'start': u'2023-09-27T18:14:00.000Z', u'end': u'2023-09-27T18:15:00Z', u'type': u'TIME_RANGE'}},

完整代码(不含打印语句)

import requests, simplejson

url = "<private>"

querystring = {
  "hosts": [
    "<private>"
  ],
  "interval": "1m",
  "query": "SELECT sum(bps) as bits, dstprefix FROM raw_flows WHERE pop = 'slc01' AND ifrole_out REGEXP '^(PEER|ISP)' AND '2023-09-27T18:14:00.000Z' <= __time AND __time < '2023-09-28T18:13:00.000Z' GROUP BY dstprefix,TIME_BUCKET(__time, PT1M, 'Etc/UTC')  ORDER BY bits DESC LIMIT 100"
}

d = simplejson.dumps(querystring)
print(d)
response = requests.post(url, data=d)

补充输出信息

>>> print(type(response))
<class 'requests.models.Response'>
>>> print(str(response))
<Response [200]>

尝试过程中的错误

我尝试用json.loads()方法提取数据时出现报错:

>>> ntop = json.loads(response)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.7/json/__init__.py", line 339, in loads
    return _default_decoder.decode(s)
  File "/usr/lib/python2.7/json/decoder.py", line 364, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
TypeError: expected string or buffer

尝试将response转为字符串后仍未解决。


问题分析与解决思路

1. 核心错误原因

你拿到的response是requests.models.Response类型的对象,不是JSON字符串或Python字典。json.loads()要求传入JSON格式的字符串,直接传对象必然报错——这就是TypeError: expected string or buffer的根源。

2. 正确解析响应的两种方法

方式一:使用response.json()(推荐)

requests库内置了JSON解析功能,调用response.json()会自动把响应体的JSON字符串转换成Python列表/字典,无需额外调用json.loads():

data = response.json()

从你的响应示例来看,data会是一个列表,每个元素都是包含dstprefix的字典。

方式二:手动提取字符串后解析

如果要手动处理,先通过response.text获取响应体的字符串,再用json.loads()转换:

import json
json_str = response.text
data = json.loads(json_str)

这种方式不如第一种简洁,且response.json()已经帮你处理了编码等细节问题。

3. 提取dstprefix字段

解析得到data列表后,遍历每个字典取出目标字段即可:

for item in data:
    # 用get()避免键不存在时报错,也可以直接用item['dstprefix']
    print(item.get('dstprefix'))

4. 模块使用说明

你已经导入的requests和simplejson足够完成任务:

  • requests负责发送请求和解析响应(内置JSON解析)
  • 标准库的json模块和第三方库simplejson功能类似,二选一即可,无需额外安装其他模块。

关键原理总结

  • HTTP响应是包含状态码、响应头、响应体的复合对象,requests将其封装为Response类
  • 响应体的JSON内容必须转换为Python数据结构(列表/字典)才能操作,response.json()是最便捷的转换方式
  • 转换后的数据可以用Python常规的遍历、键取值操作提取目标字段

内容的提问来源于stack exchange,提问作者bearju619

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 08:17:40