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

JSON格式网络设备配置取值报错求助:TypeError列表索引问题

问题:处理JSON格式网络设备配置时触发TypeError错误

处理一段JSON格式的网络设备配置片段时遇到问题,已知append函数末尾需获取键而非值,但当前执行i['policy']['name']时触发TypeError: list indices must be integers or slices, not str报错。

相关配置片段

"policy": [
      {
         "from-zone-name": "admin",
         "to-zone-name": "Switches",
         "policy": [
            {
               "name": "admin-Switches",
               "match": {
                  "source-address": [
                     "any"
                  ],
                  "destination-address": [
                     "any"
                  ],
                  "application": [
                     "any"
                  ]
               },
               "then": {
                  "permit": [
                     "None"
                  ]
               }
            }
         ]
      }
]

相关Python代码

data = self.dev.rpc.get_config(filter_xml='security',
                                       options={'format': 'json'})
        self.policies = data['configuration']['security']['policies']['policy']
        for i in self.policies:
            self.data.append([i['from-zone-name'],
                              i['to-zone-name'],
                              i['policy']['name'],
                              i['policy']['match']['source-address'],
                              i['policy']['match']['destination-address'],
                              i['policy']['match']['application'],
                              i['policy']['then'].keys()])
        print(self.data)

报错信息

i['policy']['name'],
TypeError: list indices must be integers or slices, not str

问题原因与解决方案

原因

从配置片段可以清晰看到:i['policy']是一个列表(数组),而非单个字典对象。列表只能使用整数索引或切片来访问元素,直接用字符串'name'索引自然会触发TypeError。

解决方案

由于每个from-zone-name+to-zone-name的组合下可能包含多个policy,最通用的做法是嵌套遍历i['policy']列表;如果确定每个组合下只有一个policy,也可以直接通过索引0获取元素。

修改后的代码(通用版)

data = self.dev.rpc.get_config(filter_xml='security',
                               options={'format': 'json'})
self.policies = data['configuration']['security']['policies']['policy']
for i in self.policies:
    # 遍历当前zone组合下的所有policy
    for policy in i['policy']:
        self.data.append([
            i['from-zone-name'],
            i['to-zone-name'],
            policy['name'],
            policy['match']['source-address'],
            policy['match']['destination-address'],
            policy['match']['application'],
            list(policy['then'].keys())  # 将dict_keys对象转为列表,避免后续处理问题
        ])
print(self.data)

简化版(仅当每个zone组合下只有一个policy时适用)

data = self.dev.rpc.get_config(filter_xml='security',
                               options={'format': 'json'})
self.policies = data['configuration']['security']['policies']['policy']
for i in self.policies:
    policy = i['policy'][0]  # 直接取列表第一个元素
    self.data.append([
        i['from-zone-name'],
        i['to-zone-name'],
        policy['name'],
        policy['match']['source-address'],
        policy['match']['destination-address'],
        policy['match']['application'],
        list(policy['then'].keys())
    ])
print(self.data)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 04:40:41