#python #json #meraki-api
Вопрос:
Я искал несколько недель и нигде не нашел ничего, что могло бы помочь мне с этой конкретной проблемой.
Я получил большой вывод из вызова API (Meraki), я хочу извлечь определенные функции из списка.
Задача: считайте выходные данные из вызова API, просматривайте выходные данные до тех пор, пока не будет обнаружен статус «сбой», и распечатайте интерфейс и идентификатор сети этого элемента, превратите идентификатор сети в сетевое имя из предопределенного списка и продолжайте печатать все «неудачные интерфейсы» до конца вывода.
Вызов API получает всю организацию, и я хочу сопоставить список сетевых идентификаторов с сетевыми именами (поскольку они не добавляются в один и тот же вызов API), чтобы было понятно, какая сеть имеет какой интерфейс, который вышел из строя.
Вывод содержит много данных , и мне не нужны все эти выходные значения, такие как IP, шлюз, DNS и т. Д.
пример вывода из вызова API:
{'networkId': 'A_1234567890', 'serial': 'A1B2-C3D4-E5F6', 'model': 'MX64', 'lastReportedAt': '2021-01-01T10:00:00Z', 'uplinks': [{'interface': 'wan1', 'status': 'active', 'ip': '192.168.1.2', 'gateway': '192.168.1.1', 'publicIp': '192.168.1.3', 'primaryDns': '8.8.8.8', 'secondaryDns': '8.8.4.4', 'ipAssignedBy': 'static'}, {'interface': 'wan2', 'status': 'ready', 'ip': '172.16.1.2', 'gateway': '172.16.1.1', 'publicIp': '172.16.1.3', 'primaryDns': '8.8.8.8', 'secondaryDns': '8.8.4.4', 'ipAssignedBy': 'static'}]}
Это одна сеть, в которой в этой организации насчитывается 50, статус которой я хочу проверить.
Я довольно новичок в Python и пробовал использовать циклы while для просеивания выходных данных, чтобы найти состояние сбоя, но я не могу вывести всю информацию о сети, связанную с ней, я посмотрел, но в большинстве примеров используются небольшие предопределенные списки отдельных слов или чисел.
вызов API, который я использую: (нашел шаблон и при необходимости изменил его, чтобы получить полный список всех сетей в моей организации)
import requests url = "https://api.meraki.com/api/v1/organizations/{ORG_ID}/uplinks/statuses" payload = None headers = { "Content-Type": "application/json", "Accept": "application/json", "X-Cisco-Meraki-API-Key": "API_KEY" } response = requests.request('GET', url, headers=headers, data = payload) pprint(response.json())
Ответ №1:
Ответ дан в другом посте @ Szabolcs:
net_names = {"A_1234567890": "Name"} for network_data in json_data: network_id = network_data.get("networkId") for uplink_data in network_data.get("uplinks", []): if uplink_data["status"] == "failed": print( "network ID:", network_id, "" "Network:", net_names.get(network_id, "n/a"), "- Interface:", uplink_data["interface"], "- failed",)
Делает все, что я хочу.
Ответ №2:
Основываясь на вашем примере вывода, похоже, что вы получили идентификатор сети только один раз в ответе и интерфейсе и много раз рассматривались как часть атрибута восходящей связи, следовательно, вы можете проанализировать ответ API как объект Json и сопоставить сетевые имена — идентификатор сети в словаре и сделать что-то вроде ниже, чтобы получить статус «сбой».
net_names = {'A_1234567890':'abc', 'b':'xyz'} network_id =response_json.get('networkId') for item in response_json['uplinks']: if item['status'] == "failed": print('network ID:', network_id,'network_name:',net_names.get(network_id), 'Interface:',item['interface'])
Комментарии:
1. Ошибка атрибута: объект «Ответ» не имеет атрибута «получить»
2. сначала вам нужно преобразовать ответ в JSON » response = json.loads(ответ)».
3. вызовите ошибку типа(если объект JSON должен быть str, байт или bytearray, ошибка типа: объект JSON должен быть str, байт или bytearray, а не ответ @Sid по-прежнему нет пирога.