Доступ к ключам / значениям в разбитом на страницы / вложенном словаре - PullRequest
0 голосов
/ 11 сентября 2018

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

Я получаю KeyError, пытающуюся получить доступ к ключам в response_dict, что, как я знаю, связано с тем, что оно было вложено / разбито на страницы, и я собираюсьэто неправильный путь.Кто-нибудь может помочь и / или указать мне правильное направление?

import requests
import json
URL = "https://api.constantcontact.com/v2/contacts?status=ALL&limit=1&api_key=<redacted>&access_token=<redacted>"
#make my request, store it in the requests object 'r'
r = requests.get(url = URL)
#status code to prove things are working
print (r.status_code)
#print what was retrieved from the API
print (r.text)
#visual aid
print ('---------------------------')
#decode json data to a dict
response_dict = json.loads(r.text)
#show how the API response looks now
print(response_dict)
#just for confirmation
print (type(response_dict))
print('-------------------------')
# HERE LIES THE ISSUE
print(response_dict['first_name'])

И мой вывод:

200
{"meta":{"pagination":{}},"results":[{"id":"1329683950","status":"ACTIVE","fax":"","addresses":[{"id":"4e19e250-b5d9-11e8-9849-d4ae5275509e","line1":"222 Fake St.","line2":"","line3":"","city":"Kansas City","address_type":"BUSINESS","state_code":"","state":"OK","country_code":"ve","postal_code":"19512","sub_postal_code":""}],"notes":[],"confirmed":false,"lists":[{"id":"1733488365","status":"ACTIVE"}],"source":"Site Owner","email_addresses":[{"id":"1fe198a0-b5d5-11e8-92c1-d4ae526edd6c","status":"ACTIVE","confirm_status":"NO_CONFIRMATION_REQUIRED","opt_in_source":"ACTION_BY_OWNER","opt_in_date":"2018-09-11T18:18:20.000Z","email_address":"rsmith@fake.com"}],"prefix_name":"","first_name":"Robert","middle_name":"","last_name":"Smith","job_title":"I.T.","company_name":"FBI","home_phone":"","work_phone":"5555555555","cell_phone":"","custom_fields":[],"created_date":"2018-09-11T15:12:40.000Z","modified_date":"2018-09-11T18:18:20.000Z","source_details":""}]}
---------------------------
{'meta': {'pagination': {}}, 'results': [{'id': '1329683950', 'status': 'ACTIVE', 'fax': '', 'addresses': [{'id': '4e19e250-b5d9-11e8-9849-d4ae5275509e', 'line1': '222 Fake St.', 'line2': '', 'line3': '', 'city': 'Kansas City', 'address_type': 'BUSINESS', 'state_code': '', 'state': 'OK', 'country_code': 've', 'postal_code': '19512', 'sub_postal_code': ''}], 'notes': [], 'confirmed': False, 'lists': [{'id': '1733488365', 'status': 'ACTIVE'}], 'source': 'Site Owner', 'email_addresses': [{'id': '1fe198a0-b5d5-11e8-92c1-d4ae526edd6c', 'status': 'ACTIVE', 'confirm_status': 'NO_CONFIRMATION_REQUIRED', 'opt_in_source': 'ACTION_BY_OWNER', 'opt_in_date': '2018-09-11T18:18:20.000Z', 'email_address': 'rsmith@fake.com'}], 'prefix_name': '', 'first_name': 'Robert', 'middle_name': '', 'last_name': 'Smith', 'job_title': 'I.T.', 'company_name': 'FBI', 'home_phone': '', 'work_phone': '5555555555', 'cell_phone': '', 'custom_fields': [], 'created_date': '2018-09-11T15:12:40.000Z', 'modified_date': '2018-09-11T18:18:20.000Z', 'source_details': ''}]}
<class 'dict'>
-------------------------
Traceback (most recent call last):
  File "C:\Users\rkiek\Desktop\Python WIP\Chris2.py", line 20, in <module>
    print(response_dict['first_name'])
KeyError: 'first_name'

1 Ответ

0 голосов
/ 11 сентября 2018
first_name = response_dict["results"][0]["first_name"]

Хотя я думаю, что на этот вопрос лучше ответить самому, прочитав некоторую документацию, я объясню, что здесь происходит. Вы видите, что dict-объект человека по имени "Robert" находится в списке, который является значением под ключом "results". Итак, сначала вам нужно получить доступ к значению в результатах, которое представляет собой список python.

Затем вы можете использовать цикл для итерации каждого из элементов в списке и обрабатывать каждый отдельный элемент как обычный объект словаря.

results = response_dict["results"]
results = response_dict.get("results", None) 
# use any one of the two above, the first one will throw a KeyError if there is no key=="results" the other will return NULL
# this results is now a list according to the data you mentioned.

for item in results:
    print(item.get("first_name", None)
# here you can loop through the list of dictionaries and treat each item as a normal dictionary
...