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

从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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 09:04:10