Длина словаря равна 3, но при попытке доступа к индексу, получающему KeyError - PullRequest
0 голосов
/ 06 июля 2019

Я пытаюсь разобрать ответ json, который выглядит следующим образом:

{
"links": {
    "next": "http://www.neowsapp.com/rest/v1/feed?start_date=2015-09-08&end_date=2015-09-09&detailed=false&api_key=xxx",
    "prev": "http://www.neowsapp.com/rest/v1/feed?start_date=2015-09-06&end_date=2015-09-07&detailed=false&api_key=xxx",
    "self": "http://www.neowsapp.com/rest/v1/feed?start_date=2015-09-07&end_date=2015-09-08&detailed=false&api_key=xxx"
},
"element_count": 22,
"near_earth_objects": {
    "2015-09-08": [
        {
            "links": {
                "self": "http://www.neowsapp.com/rest/v1/neo/3726710?api_key=xxx"
            },
            "id": "3726710",
            "neo_reference_id": "3726710",
            "name": "(2015 RC)",
            "nasa_jpl_url": "http://ssd.jpl.nasa.gov/sbdb.cgi?sstr=3726710",
            "absolute_magnitude_h": 24.3,
            "estimated_diameter": {
                "kilometers": {
                    "estimated_diameter_min": 0.0366906138,
                    "estimated_diameter_max": 0.0820427065
                },
                "meters": {
                    "estimated_diameter_min": 36.6906137531,
                    "estimated_diameter_max": 82.0427064882
                },
                "miles": {
                    "estimated_diameter_min": 0.0227984834,
                    "estimated_diameter_max": 0.0509789586
                },
                "feet": {
                    "estimated_diameter_min": 120.3760332259,
                    "estimated_diameter_max": 269.1689931548
                }
            },
            "is_potentially_hazardous_asteroid": false,
            "close_approach_data": [
                {
                    "close_approach_date": "2015-09-08",
                    "close_approach_date_full": "2015-Sep-08 09:45",
                    "epoch_date_close_approach": 1441705500000,
                    "relative_velocity": {
                        "kilometers_per_second": "19.4850295284",
                        "kilometers_per_hour": "70146.106302123",
                        "miles_per_hour": "43586.0625520053"
                    },
                    "miss_distance": {
                        "astronomical": "0.0269230459",
                        "lunar": "10.4730648551",
                        "kilometers": "4027630.320552233",
                        "miles": "2502653.4316094954"
                    },
                    "orbiting_body": "Earth"
                }
            ],
            "is_sentry_object": false
        },

}

Я пытаюсь выяснить, как разобрать, чтобы получить значения словаря "miss_distance"? Я не могу обернуть голову вокруг этого.

Вот что я смог сделать до сих пор:

  1. После того, как я получу объект Response от request.get () response = request.get (url

  2. Я конвертирую объект ответа в объект json data = response.json () # это возвращает объект словаря

  3. Я пытаюсь разобрать первый уровень словаря: для меня в данных: если я == "near_earth_objects": dataset1 = data ["near_earth_objects"] ["2015-09-08"] # это возвращает следующий объект типа list

Пожалуйста, кто-нибудь может объяснить мне: 1. Как расшифровать этот ответ в первую очередь. 2. Как я могу двигаться вперед при разборе объекта ответа и попасть в словарь miss_distance?

Пожалуйста, любые указатели / помощь приветствуется.

Спасибо

Ответы [ 2 ]

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

Ваши данные будут иметь несколько словарей для каждой даты, околоземного объекта и близкого приближения:

near_earth_objects = data['near_earth_objects']
for date in near_earth_objects:
    objects = near_earth_objects[date]
    for object in objects:
        close_approach_data = object['close_approach_data']
        for close_approach in close_approach_data:
            print(close_approach['miss_distance'])
0 голосов
/ 06 июля 2019

Приведенный ниже код дает вам таблицу date, miss_distances для каждого объекта на каждую дату

import json
raw_json = '''
{
    "near_earth_objects": {
        "2015-09-08": [
            {
                "close_approach_data": [
                    {
                        "miss_distance": {
                            "astronomical": "0.0269230459",
                            "lunar": "10.4730648551",
                            "kilometers": "4027630.320552233",
                            "miles": "2502653.4316094954"
                        },
                        "orbiting_body": "Earth"
                    }
                ]
            }
        ]
    }
}
'''

if __name__ == "__main__":
    parsed = json.loads(raw_json)

    # assuming this json includes more than one near_earch_object spread across dates
    near_objects = []
    for date, near_objs in parsed['near_earth_objects'].items():
        for obj in near_objs:
            for appr in obj['close_approach_data']:
                o = {
                    'date': date,
                    'miss_distances': appr['miss_distance']
                }
                near_objects.append(o)
    print(near_objects)

вывод:

[
  {'date': '2015-09-08', 
   'miss_distances': {
     'astronomical': '0.0269230459', 
     'lunar': '10.4730648551', 
     'kilometers': '4027630.320552233', 
     'miles': '2502653.4316094954'
    }
  }
]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...