Почему я получаю KeyError, когда пытаюсь получить доступ к первому элементу этого файла JSON в скрипте Python - PullRequest
0 голосов
/ 09 июля 2019

Я пытаюсь перебрать конфигурационный файл JSON и обработать каждый сервис по одному. Я хочу получить имя_сервиса в этом коде, но оно дает мне KeyError: 0.

Я пробовал циклически проходить через него различными способами, но каждый метод, который я пробовал, выдает мне ошибку ключа.

{
  "my_services": [
    {
      "service_name" : "Exchange Online",
      "region": [
        "NorthCentral",
        "SouthCentral"
      ],
      "firewall": [
        "ABC",
        "DEF"
      ],
      "firewall_ip" : "12.23.34.455",
      "firewall_type" : "cde",
      "endpointURL" : "something.com",
      "parserType" : "parseO365Delta.py"
    },
    {
      "service_name" : "Microsoft 365 Common and Office Online",
      "region": [
        "NorthCentral",
        "SouthCentral"
      ],
      "firewall": [
        "ABC"
      ],
      "firewall_ip" : "98.87.76.655",
      "firewall_type" : "abc",
      "endpointURL" : "alsosomething.com",
      "parserType" : "parseO365Delta.py"
    }
  ]
}
import json
import subprocess

def processService(service):
    for item in service[0].values():
        print(item)

def main():
    with open('config.json', 'r') as config:
        config_list = json.load(config)

    for services in config_list["my_services"]:
        processService(services) 

if __name__ == "__main__":
    main()

Ответы [ 2 ]

1 голос
/ 09 июля 2019

Значение "my_services" представляет собой список диктов.

service внутри processService - это словарь, а не список. Следовательно

for item in service[0].values():

следует изменить на

for item in service.values():
0 голосов
/ 09 июля 2019

UPDATE:

Мне удалось выяснить это с помощью словарного метода get, который дает ключ в словаре и возвращает соответствующее значение.

Строка кода, которую я использовал для получения связанного значения:

def processService(service):
    print(service.get("service_name"))

Это возвращает каждое связанное имя_сервиса в моем списке конфигурации.

...