无法解析json.dumps生成的字符串,提取指定分析结果键的技术求助
解决方法
问题核心是你误用了json.dumps():这个函数是把Python的列表/字典转成JSON格式的字符串,而非保留原生可操作的数据结构。所以变量y本质是字符串,不是列表/字典,自然没法用列表索引或字典键来提取数据。
方案1:直接使用原生Python数据结构(推荐)
去掉json.dumps()这一步,直接操作存储API结果的列表:
import requests # 示例:提取唯一IP unique_ips = ["1.2.3.4", "5.6.7.8"] vt_results = [] API_KEY = "你的VirusTotal API密钥" # 调用API并收集结果 for ip in unique_ips: url = f"https://www.virustotal.com/api/v3/ip_addresses/{ip}" headers = {"x-apikey": API_KEY} response = requests.get(url, headers=headers) # 直接将API返回的JSON转成Python字典,存入列表 vt_results.append(response.json()) # 遍历列表提取引擎信息 for ip_result in vt_results: # 定位到分析结果层级 analysis = ip_result["data"]["attributes"]["last_analysis_results"] # 遍历每个引擎的检测结果 for engine_name, engine_info in analysis.items(): category = engine_info["category"] result = engine_info["result"] print(f"引擎: {engine_name} | 分类: {category} | 结果: {result}")
方案2:如果已经生成了JSON字符串,先解析回Python对象
如果因为存储/传输需求已经把列表转成了字符串y,需要用json.loads()把它转回原生列表/字典:
import json # 假设y是已通过json.dumps(vt_results)生成的字符串 vt_results = json.loads(y) # 正常提取首个结果的引擎信息 first_ip_result = vt_results[0] analysis_results = first_ip_result["data"]["attributes"]["last_analysis_results"] # 提取指定引擎(如Bkav)的结果示例 bkav_info = analysis_results["Bkav"] print(f"Bkav 分类: {bkav_info['category']}, 检测结果: {bkav_info['result']}")
注意事项
- 严格匹配API返回结构:VirusTotal的IP分析结果层级是
data -> attributes -> last_analysis_results,要确保键名拼写正确,避免触发KeyError。 - 加入异常处理:实际代码中要捕获网络请求失败、API返回错误码等异常,避免程序直接崩溃。
内容的提问来源于stack exchange,提问作者catchabyte
相关产品推荐
相关产品推荐

