网络工程师求助:如何从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
相关产品推荐
相关产品推荐

