Извлечение данных из файла JSON, проблема с keyerror

Я пытаюсь извлечь определенные позиции из прайс-листа AWS, но продолжаю получать приведенный ниже код ошибки. Есть ли ошибка в структуре JSON?

Traceback (most recent call last):
  File "/Python/python2.py", line 5, in <module>
    for r in data['SJQU8C5FNVFYMK7X']:
KeyError: 'SJQU8C5FNVFYMK7X

JSON FILE

"SJQU8C5FNVFYMK7X" : {
  "sku" : "SJQU8C5FNVFYMK7X",
  "productFamily" : "Compute Instance",
  "attributes" : {
    "servicecode" : "AmazonEC2",
    "location" : "Asia Pacific (Singapore)",
    "locationType" : "AWS Region",
    "instanceType" : "r5n.8xlarge",
    "currentGeneration" : "Yes",
    "instanceFamily" : "Memory optimized",
    "vcpu" : "32",
    "physicalProcessor" : "Intel Xeon Platinum 8259 (Cascade Lake)",
    "clockSpeed" : "2.5 GHz",
    "memory" : "256 GiB",
    "storage" : "EBS only",
    "networkPerformance" : "25 Gigabit",
    "processorArchitecture" : "64-bit",
    "tenancy" : "Shared",
    "operatingSystem" : "Windows",
    "licenseModel" : "No License required",
    "usagetype" : "APS1-BoxUsage:r5n.8xlarge",
    "operation" : "RunInstances:0102",
    "capacitystatus" : "Used",
    "dedicatedEbsThroughput" : "5000 Mbps",
    "ecu" : "NA",
    "enhancedNetworkingSupported" : "No",
    "intelAvxAvailable" : "No",
    "intelAvx2Available" : "No",
    "intelTurboAvailable" : "No",
    "normalizationSizeFactor" : "64",
    "preInstalledSw" : "SQL Ent",
    "servicename" : "Amazon Elastic Compute Cloud"
  }

Код Python:

import json

with open('index (5).json') as json_file:
    data = json.load(json_file)
    for r in data['SJQU8C5FNVFYMK7X']:
        print (r)

Есть идеи, что я делаю не так?

Всего 2 ответа


Вы пропустили несколько фигурных скобок вокруг всего, json ниже правильно разбирает

{
    "SJQU8C5FNVFYMK7X": {
        "sku": "SJQU8C5FNVFYMK7X",
        "productFamily": "Compute Instance",
        "attributes": {
            "servicecode": "AmazonEC2",
            "location": "Asia Pacific (Singapore)",
            "locationType": "AWS Region",
            "instanceType": "r5n.8xlarge",
            "currentGeneration": "Yes",
            "instanceFamily": "Memory optimized",
            "vcpu": "32",
            "physicalProcessor": "Intel Xeon Platinum 8259 (Cascade Lake)",
            "clockSpeed": "2.5 GHz",
            "memory": "256 GiB",
            "storage": "EBS only",
            "networkPerformance": "25 Gigabit",
            "processorArchitecture": "64-bit",
            "tenancy": "Shared",
            "operatingSystem": "Windows",
            "licenseModel": "No License required",
            "usagetype": "APS1-BoxUsage:r5n.8xlarge",
            "operation": "RunInstances:0102",
            "capacitystatus": "Used",
            "dedicatedEbsThroughput": "5000 Mbps",
            "ecu": "NA",
            "enhancedNetworkingSupported": "No",
            "intelAvxAvailable": "No",
            "intelAvx2Available": "No",
            "intelTurboAvailable": "No",
            "normalizationSizeFactor": "64",
            "preInstalledSw": "SQL Ent",
            "servicename": "Amazon Elastic Compute Cloud"
        }
    }
}

Обратите внимание, что вы можете использовать онлайн-линтер для проверки ошибок синтаксического анализа (например, https://jsonlint.com/ )


Самый простой способ отладки - открыть сеанс интерактивного интерпретатора и посмотреть, какие ключи присутствуют:

>>> import json
>>> json_file = open('index (5).json')
>>> data = json.load(json_file)
>>> data.keys()

Возможно, вы захотите привести data.keys() к списку (т.е. list(data.keys()) ), если вы хотите вообще им манипулировать. Но по крайней мере это покажет вам, что думает json.load это ключи.


Есть идеи?

10000