从Cisco补丁站获取数据并映射为指定JSON格式的问题求助
解决Cisco补丁数据映射到ServiceNow Event Management的问题
咱们先定位你遇到的核心问题:你的getjson函数返回的是JSON数组(包含多个补丁对象的列表),但你在createJson里直接把它当成单个JSON对象来调用.get()方法,这就导致了AttributeError——列表类型根本没有get方法。
下面给你完整的修正方案,包括循环处理所有补丁数据、正确的字段映射,以及逐一POST到ServiceNow的逻辑:
1. 修正后的完整代码示例
import json import urllib.request def getjson(ciscourl): response = urllib.request.urlopen(ciscourl) ciscodata = response.read().decode("utf-8") # 这里返回的是一个列表(JSON数组),每个元素是单个补丁的对象 return json.loads(ciscodata) def create_service_now_event(patch_item): # 单个补丁对象的字段映射,完全匹配你需要的自定义JSON结构 service_now_event = { "source": "CiscoUpdatePatchChecker", "node": patch_item.get("identifier"), # 正确从单个补丁对象提取identifier字段 "description": f"Cisco补丁更新通知: {patch_item.get('title', '未命名补丁')}", "additional_info": json.dumps(patch_item), # 把完整补丁数据转成字符串存入附加信息 # 可根据ServiceNow要求添加更多字段,比如 severity、event_class 等 "severity": patch_item.get("severity", 3), "event_class": "patch.update.cisco" } return json.dumps(service_now_event) def post_to_service_now(event_json, servicenow_url): # 复用你已验证正常的POST逻辑,这里补充了通用的请求头设置 headers = { "Content-Type": "application/json", # 如果ServiceNow需要认证,添加对应的Authorization头 # "Authorization": "Basic 你的Base64编码认证信息" } req = urllib.request.Request( servicenow_url, data=event_json.encode("utf-8"), headers=headers, method="POST" ) with urllib.request.urlopen(req) as response: return response.read().decode("utf-8") # 主执行逻辑 if __name__ == "__main__": cisco_patch_url = "你的Cisco补丁站点API地址" servicenow_event_api = "你的ServiceNow Event Management API地址" # 获取所有补丁数据(数组格式) all_cisco_patches = getjson(cisco_patch_url) # 循环处理每个补丁,生成事件并逐一POST for patch in all_cisco_patches: event_json = create_service_now_event(patch) servicenow_response = post_to_service_now(event_json, servicenow_event_api) print(f"补丁 {patch.get('identifier')} 已提交,ServiceNow响应: {servicenow_response}")
2. 关键修正点说明
- 遍历数组元素:不再直接操作整个返回的数组,而是用
for patch in all_cisco_patches循环处理每个独立的补丁对象 - 正确提取字段:针对单个补丁对象
patch_item调用.get()方法,彻底解决AttributeError问题 - 容错处理:使用
.get('字段名', 默认值)的方式提取字段,避免因某个字段缺失导致代码崩溃 - 模块化拆分:把生成事件和POST请求拆分成独立函数,代码更易维护和调试
3. 快速排查技巧
如果还是遇到字段提取异常,先打印单个补丁对象的完整结构,确认字段名是否正确:
all_cisco_patches = getjson(cisco_patch_url) # 打印第一个补丁的结构,验证字段名拼写是否正确 print(json.dumps(all_cisco_patches[0], indent=2))
内容的提问来源于stack exchange,提问作者Dan Tembe
相关产品推荐
相关产品推荐

