首页 > 解决方案 > 通过 Python 脚本/代码获取特定的 dict 值

问题描述

我正在通过 Python 执行 RESTAPI 调用,并在执行 json.loads 调用后以 dict 格式获取值。

挑战是,我想获取以下值:

a)“校验和”:“f9676703bba1f3ac726de1445de27726”

b) 'zone-name': 'Axel_Rodge_SPA' (输出中所有可用的区域名称)

我尝试了很多通过 .get() 方法获取的方法,但并没有太大帮助。此外,它不是正确的 dict 数据类型,这是另一个挑战。任何建议将不胜感激。

global switch_config_backup_json
call_config_backup = ""
try:
    switch_config_url = 'http://' + ipaddress + '/rest/running/brocade-zone/effective-configuration'
    switch_config_backup_call_headers = {'Authorization': custom_api_key, 'Accept': 'application/yang-data+json', 'Content-Type': 'application/yang-data+json'}
    call_config_backup = requests.get(url=switch_config_url, headers=switch_config_backup_call_headers)
    switch_config_backup_dict = json.loads(call_config_backup.content)
    print("Switch zone and members data backup:\n", switch_config_backup_dict)

检索到的值:(字典类型)

{'响应':{'有效配置':{'default-zone-access':1,'cfg-action':0,'db-max':1045274,'db-avail':1041908,'db-已提交':1268,'db-transaction':0,'db-chassis-wide-committed':2280,'transaction-token':0,'校验和':'f9676703bba1f3ac726de1445de27726','cfg-name':'b238638' , '启用区域': [{'zone-name': 'Axel_Dellpr740A', 'zone-type': 0, 'member-entry': {'entry-name': ['50:06:01:63: 08:60:1d:e8', '50:06:01:6b:08:60:1d:e8', '10:00:00:10:9b:58:31:71']}}, {' zone-name': 'Axel_Dellpr740C', 'zone-type': 0, 'member-entry': {'entry-name': ['50:06:01:6b:08:60:1d:e8', ' 50:06:01:63:08:60:1d:e8','10:00:00:10:9b:58:31:e3']}},{'zone-name':'Axel_Rodge_SPA','zone-type':0,'member-entry':{'entry-name ': ['50:06:01:63:08:60:1d:e8', '50:06:01:63:08:64:0f:45']}}, {'区域名称': ' Axel_Rodge_SPA_Test', 'zone-type': 0, 'member-entry': {'entry-name': ['50:06:01:63:08:60:1d:e8', '50:06:01: 63:08:64:0f:45']}}, {'zone-name': 'Axel_Rodge_SPB', 'zone-type': 0, 'member-entry': {'entry-name': ['50: 06:01:6b:08:60:1d:e8', '50:06:01:6b:08:60:0f:45']}}, {'区域名称': 'Rodge-Dellpr730H', ' zone-type': 0, 'member-entry': {'entry-name': ['50:06:01:63:08:64:0f:45', '50:06:01:6b:08: 60:0f:45', '10:00:00:10:9b:26:3f:fb']}}, {'区域名称:'Rodge_Dellpr730E','区域类型':0,'成员入口':{'入口名称':['50:06:01:6b:08:60:0f:45',' 50:06:01:63:08:64:0f:45', '10:00:00:90:fa:02:4c:c4']}}, {'区域名称': 'dellpr730B_Marge', ' zone-type': 0, 'member-entry': {'entry-name': ['21:00:00:24:ff:17:19:cc', '21:00:00:24:ff: 17:19:cd', '50:00:09:75:a8:1d:40:19', '50:00:09:75:a8:1d:40:5d']}}]}}}cc'、'21:00:00:24:ff:17:19:cd'、'50:00:09:75:a8:1d:40:19'、'50:00:09:75:a8: 1d:40:5d']}}]}}}cc'、'21:00:00:24:ff:17:19:cd'、'50:00:09:75:a8:1d:40:19'、'50:00:09:75:a8: 1d:40:5d']}}]}}}

标签: python

解决方案


你有dictionarylist所以你需要for-loop (或索引 ie. [0])来获取值。

而且因为您已经嵌套dictionares,所以您将不得不使用所有键来获取嵌套值。

data = {'Response': {'effective-configuration': {'default-zone-access': 1, 'cfg-action': 0, 'db-max': 1045274, 'db-avail': 1041908, 'db-committed': 1268, 'db-transaction': 0, 'db-chassis-wide-committed': 2280, 'transaction-token': 0, 'checksum': 'f9676703bba1f3ac726de1445de27726', 'cfg-name': 'b238638', 'enabled-zone': [{'zone-name': 'Axel_Dellpr740A', 'zone-type': 0, 'member-entry': {'entry-name': ['50:06:01:63:08:60:1d:e8', '50:06:01:6b:08:60:1d:e8', '10:00:00:10:9b:58:31:71']}}, {'zone-name': 'Axel_Dellpr740C', 'zone-type': 0, 'member-entry': {'entry-name': ['50:06:01:6b:08:60:1d:e8', '50:06:01:63:08:60:1d:e8', '10:00:00:10:9b:58:31:e3']}}, {'zone-name': 'Axel_Rodge_SPA', 'zone-type': 0, 'member-entry': {'entry-name': ['50:06:01:63:08:60:1d:e8', '50:06:01:63:08:64:0f:45']}}, {'zone-name': 'Axel_Rodge_SPA_Test', 'zone-type': 0, 'member-entry': {'entry-name': ['50:06:01:63:08:60:1d:e8', '50:06:01:63:08:64:0f:45']}}, {'zone-name': 'Axel_Rodge_SPB', 'zone-type': 0, 'member-entry': {'entry-name': ['50:06:01:6b:08:60:1d:e8', '50:06:01:6b:08:60:0f:45']}}, {'zone-name': 'Rodge-Dellpr730H', 'zone-type': 0, 'member-entry': {'entry-name': ['50:06:01:63:08:64:0f:45', '50:06:01:6b:08:60:0f:45', '10:00:00:10:9b:26:3f:fb']}}, {'zone-name': 'Rodge_Dellpr730E', 'zone-type': 0, 'member-entry': {'entry-name': ['50:06:01:6b:08:60:0f:45', '50:06:01:63:08:64:0f:45', '10:00:00:90:fa:02:4c:c4']}}, {'zone-name': 'dellpr730B_Marge', 'zone-type': 0, 'member-entry': {'entry-name': ['21:00:00:24:ff:17:19:cc', '21:00:00:24:ff:17:19:cd', '50:00:09:75:a8:1d:40:19', '50:00:09:75:a8:1d:40:5d']}}]}}}

#print('[DEBUG] type:', type(data) )
#print('[DEBUG] keys:', data.keys() )

#print('[DEBUG] type:', type(data['Response']) )
#print('[DEBUG] keys:', data['Response'].keys() )

#print('[DEBUG] type:', type(data['Response']['effective-configuration']) )
#print('[DEBUG] keys:', data['Response']['effective-configuration'].keys() )

checksum = data['Response']['effective-configuration']['checksum']
print('checksum:', checksum)

zones = data['Response']['effective-configuration']['enabled-zone']
print('type:', type(zones))

for item in zones:
    print('zone-name:', item['zone-name'])

结果:

checksum: f9676703bba1f3ac726de1445de27726
type: <class 'list'>
zone-name: Axel_Dellpr740A
zone-name: Axel_Dellpr740C
zone-name: Axel_Rodge_SPA
zone-name: Axel_Rodge_SPA_Test
zone-name: Axel_Rodge_SPB
zone-name: Rodge-Dellpr730H
zone-name: Rodge_Dellpr730E
zone-name: dellpr730B_Marge

顺便提一句:

您可以使用json.dumps(..., indent=...)缩进对其进行格式化,以更好地查看JSON.

如果你看到{...}那么它是 (nested) dictionary,如果你看到[...]那么它是 (nested) list

您还可以使用type(item)来测试您是否有(嵌套)dictionarylist.
并且dictionary您可以使用item.keys()来查看您可以在此级别上使用的键。

data = {'Response': {'effective-configuration': {'default-zone-access': 1, 'cfg-action': 0, 'db-max': 1045274, 'db-avail': 1041908, 'db-committed': 1268, 'db-transaction': 0, 'db-chassis-wide-committed': 2280, 'transaction-token': 0, 'checksum': 'f9676703bba1f3ac726de1445de27726', 'cfg-name': 'b238638', 'enabled-zone': [{'zone-name': 'Axel_Dellpr740A', 'zone-type': 0, 'member-entry': {'entry-name': ['50:06:01:63:08:60:1d:e8', '50:06:01:6b:08:60:1d:e8', '10:00:00:10:9b:58:31:71']}}, {'zone-name': 'Axel_Dellpr740C', 'zone-type': 0, 'member-entry': {'entry-name': ['50:06:01:6b:08:60:1d:e8', '50:06:01:63:08:60:1d:e8', '10:00:00:10:9b:58:31:e3']}}, {'zone-name': 'Axel_Rodge_SPA', 'zone-type': 0, 'member-entry': {'entry-name': ['50:06:01:63:08:60:1d:e8', '50:06:01:63:08:64:0f:45']}}, {'zone-name': 'Axel_Rodge_SPA_Test', 'zone-type': 0, 'member-entry': {'entry-name': ['50:06:01:63:08:60:1d:e8', '50:06:01:63:08:64:0f:45']}}, {'zone-name': 'Axel_Rodge_SPB', 'zone-type': 0, 'member-entry': {'entry-name': ['50:06:01:6b:08:60:1d:e8', '50:06:01:6b:08:60:0f:45']}}, {'zone-name': 'Rodge-Dellpr730H', 'zone-type': 0, 'member-entry': {'entry-name': ['50:06:01:63:08:64:0f:45', '50:06:01:6b:08:60:0f:45', '10:00:00:10:9b:26:3f:fb']}}, {'zone-name': 'Rodge_Dellpr730E', 'zone-type': 0, 'member-entry': {'entry-name': ['50:06:01:6b:08:60:0f:45', '50:06:01:63:08:64:0f:45', '10:00:00:90:fa:02:4c:c4']}}, {'zone-name': 'dellpr730B_Marge', 'zone-type': 0, 'member-entry': {'entry-name': ['21:00:00:24:ff:17:19:cc', '21:00:00:24:ff:17:19:cd', '50:00:09:75:a8:1d:40:19', '50:00:09:75:a8:1d:40:5d']}}]}}}

import json

text = json.dumps(data, indent=2)
print(text)

结果:

{
  "Response": {
    "effective-configuration": {
      "default-zone-access": 1,
      "cfg-action": 0,
      "db-max": 1045274,
      "db-avail": 1041908,
      "db-committed": 1268,
      "db-transaction": 0,
      "db-chassis-wide-committed": 2280,
      "transaction-token": 0,
      "checksum": "f9676703bba1f3ac726de1445de27726",
      "cfg-name": "b238638",
      "enabled-zone": [
        {
          "zone-name": "Axel_Dellpr740A",
          "zone-type": 0,
          "member-entry": {
            "entry-name": [
              "50:06:01:63:08:60:1d:e8",
              "50:06:01:6b:08:60:1d:e8",
              "10:00:00:10:9b:58:31:71"
            ]
          }
        },
        {
          "zone-name": "Axel_Dellpr740C",
          "zone-type": 0,
          "member-entry": {
            "entry-name": [
              "50:06:01:6b:08:60:1d:e8",
              "50:06:01:63:08:60:1d:e8",
              "10:00:00:10:9b:58:31:e3"
            ]
          }
        },
        {
          "zone-name": "Axel_Rodge_SPA",
          "zone-type": 0,
          "member-entry": {
            "entry-name": [
              "50:06:01:63:08:60:1d:e8",
              "50:06:01:63:08:64:0f:45"
            ]
          }
        },
        {
          "zone-name": "Axel_Rodge_SPA_Test",
          "zone-type": 0,
          "member-entry": {
            "entry-name": [
              "50:06:01:63:08:60:1d:e8",
              "50:06:01:63:08:64:0f:45"
            ]
          }
        },
        {
          "zone-name": "Axel_Rodge_SPB",
          "zone-type": 0,
          "member-entry": {
            "entry-name": [
              "50:06:01:6b:08:60:1d:e8",
              "50:06:01:6b:08:60:0f:45"
            ]
          }
        },
        {
          "zone-name": "Rodge-Dellpr730H",
          "zone-type": 0,
          "member-entry": {
            "entry-name": [
              "50:06:01:63:08:64:0f:45",
              "50:06:01:6b:08:60:0f:45",
              "10:00:00:10:9b:26:3f:fb"
            ]
          }
        },
        {
          "zone-name": "Rodge_Dellpr730E",
          "zone-type": 0,
          "member-entry": {
            "entry-name": [
              "50:06:01:6b:08:60:0f:45",
              "50:06:01:63:08:64:0f:45",
              "10:00:00:90:fa:02:4c:c4"
            ]
          }
        },
        {
          "zone-name": "dellpr730B_Marge",
          "zone-type": 0,
          "member-entry": {
            "entry-name": [
              "21:00:00:24:ff:17:19:cc",
              "21:00:00:24:ff:17:19:cd",
              "50:00:09:75:a8:1d:40:19",
              "50:00:09:75:a8:1d:40:5d"
            ]
          }
        }
      ]
    }
  }
}

推荐阅读