#json #python-3.x #list #dictionary
Вопрос:
До сих пор у меня есть следующий код:
for endpoint in endpoints: post_aga = APINSRRequestsRouter() response_obj_aga = post_aga.send_aga_post_request(endpoint) if response_obj_aga: if response_obj_aga[0] == "201": id = response_obj_aga[1]["ACK"]["id"] #dictionary with list code here
response_obj_aga-это объект списка, содержащий строку и объект json, как показано на примере:
['200', {'ACK': {'message': 'something happened', 'id': '319711da-20fd-4c94-bf8b-04735b435dd1'}}]
Что я хочу сделать, так это каждый раз, когда я получаю объект response_obj_aga, содержащий идентификатор, я хочу добавить этот идентификатор в список в словаре, чтобы я мог сохранить его как объект JSON в своей базе данных. Итак, допустим, я ожидаю 3 отдельных ответа и имею следующие данные:
['200', {'ACK': {'message': 'something happened', 'id': '17d362ae-a796-40fd-a1c3-0ff64e6f62e0'}}] ['200', {'ACK': {'message': 'something happened', 'id': '54e63ab8-aa1b-4d6f-a570-6ee7e52e2318'}}] ['200', {'ACK': {'message': 'something happened', 'id': 'b0a8ad20-b3e6-4100-963e-0f5e7f7e51f5'}}]
То, что я хочу получить в конце своего цикла, было бы примерно так:
{ "ids": [ "17d362ae-a796-40fd-a1c3-0ff64e6f62e0", "54e63ab8-aa1b-4d6f-a570-6ee7e52e2318", "b0a8ad20-b3e6-4100-963e-0f5e7f7e51f5" ] }
Каков был бы наиболее эффективный способ сделать это?
Ответ №1:
Создайте объект шаблона и добавьте к нему идентификаторы по мере чтения ответов.
Рабочий пример:
import json responses = [['200', {'ACK': {'message': 'something happened', 'id': '17d362ae-a796-40fd-a1c3-0ff64e6f62e0'}}], ['200', {'ACK': {'message': 'something happened', 'id': '54e63ab8-aa1b-4d6f-a570-6ee7e52e2318'}}], ['200', {'ACK': {'message': 'something happened', 'id': 'b0a8ad20-b3e6-4100-963e-0f5e7f7e51f5'}}]] result = {'ids':[]} for response in responses: result['ids'].append(response[1]['ACK']['id']) print(json.dumps(result, indent=2))
Выход:
{ "ids": [ "17d362ae-a796-40fd-a1c3-0ff64e6f62e0", "54e63ab8-aa1b-4d6f-a570-6ee7e52e2318", "b0a8ad20-b3e6-4100-963e-0f5e7f7e51f5" ] }
Как должен выглядеть ваш код:
result = {'ids':[]} for endpoint in endpoints: post_aga = APINSRRequestsRouter() response_obj_aga = post_aga.send_aga_post_request(endpoint) if response_obj_aga: if response_obj_aga[0] == "201": id_ = response_obj_aga[1]["ACK"]["id"] result['ids'].append(id_)
Примечание: id
является встроенной функцией в Python и не должна использоваться для имени переменной.