Я получаю данные JSON из запроса RESTCONF HTTPS, используя следующий код.

https_request = 'https://' + host + '/restconf/data/Cisco-IOS-XE-native:native/interface/'
headers = {'Content-type': 'application/yang-data+json', 'Accept': 'application/yang-data+json'}
r = requests.get(https_request, auth=(user, password), headers=headers, verify=False)
print r.json()

Файл JSON, который я получил:

{
"Cisco-IOS-XE-native:interface": {
    "GigabitEthernet": [
        {
            "name": "1",
            "description": "DON'T TOUCH ME",
            "isis": {
                "Cisco-IOS-XE-isis:metric": {
                    "value": 2
             }
            ....
        },
        {
            "name": "2",
            "isis": {
                "Cisco-IOS-XE-isis:metric": {
                    "value": 4
                } ....

        },
        {
            "name": "3",
            "shutdown": [
                null
            ],
            "isis": {
                "Cisco-IOS-XE-isis:metric": {
                    "value": 7
                }....                
        }
    ],
    "Loopback": [
        {
            "name": 0,
            "isis": {
                "Cisco-IOS-XE-isis:metric": {
                    "value": 1
                }               
    ],
    "Tunnel": [
        {
            "name": 0,
            "isis": {
                "Cisco-IOS-XE-isis:metric": {
                    "value": 3
                }....
            }
    ]
}

По сути, я хочу, чтобы моя функция возвращала "value" поля isis поля каждого интерфейса. Я попробовал следующий код для GigabitEthernet:

value = r.json()['Cisco-IOS-XE-native:interface']['GigabitEthernet'][0]['isis']['metric']['value']

Я получил эту ошибку:

print Router_1.get_isis_metric()['Cisco-IOS-XE-native:interface']['GigabitEthernet'][0]['isis']['metric']['isis']
KeyError: 'metric'
0
Tim Luka 29 Май 2019 в 15:10

2 ответа

Лучший ответ

Я думаю, вы ошиблись metric в Cisco-IOS-XE-isis:metric

Пытаться :

value = r.json()['Cisco-IOS-XE-native:interface']['GigabitEthernet'][0]['isis']['Cisco-IOS-XE-isis:metric']['value']

Изменить 1

for index in range(len(r.json()['Cisco-IOS-XE-native:interface']['GigabitEthernet'])):
    value = r.json()['Cisco-IOS-XE-native:interface']['GigabitEthernet'][index]['isis']['Cisco-IOS-XE-isis:metric']['value']
    print(value)
5
Harsha Biyani 29 Май 2019 в 12:22

Используя понимание списка, где вы перебираете список словарей и собираете значение для каждого интерфейса, например для GigabitEthernet


dct = {
"Cisco-IOS-XE-native:interface": {
    "GigabitEthernet": [
        {
            "name": "1",
            "description": "DON'T TOUCH ME",
            "isis": {
                "Cisco-IOS-XE-isis:metric": {
                    "value": 2
             }}

        },
        {
            "name": "2",
            "isis": {
                "Cisco-IOS-XE-isis:metric": {
                    "value": 4
                }}

        },
        {
            "name": "3",
            "shutdown": [
                None
            ],
            "isis": {
                "Cisco-IOS-XE-isis:metric": {
                    "value": 7
                }}
        }
    ]}}

result = [item['isis']["Cisco-IOS-XE-isis:metric"]['value'] for item in dct['Cisco-IOS-XE-native:interface']['GigabitEthernet']]

Выход будет

[2, 4, 7]

Или, чтобы собрать значения для всех интерфейсов, вы можете перебрать интерфейсы и собрать значения для каждого интерфейса

interfaces = ['GigabitEthernet', 'Loopback', 'Tunnel']
result = [item['isis']["Cisco-IOS-XE-isis:metric"]['value'] for interface in interfaces for item in dct['Cisco-IOS-XE-native:interface'][interface]]
print(result)

Выход будет

[2, 4, 7, 1, 3]
3
Devesh Kumar Singh 29 Май 2019 в 12:28