Извлечение данные из JSON в Python
Я работаю с qiwi api на python 3.9. Мне нужно извлечь определенные данные из json'а и записать их в бд.
Есть следующий код:
token = 'api token'
wallet = 'wallet number'
def payment_history():
s = requests.Session()
s.headers['Authorization'] = 'Bearer ' + token
parameters = {'rows': 10} # последние 10 платежей
h = s.get('https://edge.qiwi.com/payment-history/v2/persons/' + wallet + '/payments', params = parameters)
return h.json()
Ответом мне приходит json, где в data идут последние 10 платежей. Вот кусок из json'а:
{
"data":[
{
"txnId":12345678901,
"personId":79161112233,
"date":"2021-07-30T14:29:33+03:00",
"errorCode":0,
"error":"None",
"status":"SUCCESS",
"type":"IN",
"statusText":"Success",
"trmTxnId":"1122334455667",
"account":"",
"sum":{
"amount":12,
"currency":643
},
"comment":"None",
"currencyRate":1,
},
{
"txnId":12345678902,
"personId":79161112233,
"date":"2021-07-30T14:29:11+03:00",
"errorCode":0,
"error":"None",
"status":"SUCCESS",
"type":"IN",
"statusText":"Success",
"trmTxnId":"11223344556",
"account":"",
"sum":{
"amount":8,
"currency":643
},
"comment":"комментарий к платежу",
"currencyRate":1,
}
],
"nextTxnId":"None",
"nextTxnDate":"None"
}
Подскажите пожалуйста, как можно извлечь из этого json'а значения txnId, sum.amount и comment? Буду благодарен любой помощи
Ответы (2 шт):
В json у вас словарь, состоящий из списка словарей, где каждый словарь это платеж. Вам нужно работать с этим как с соответствующими типами питона
Пример:
history = payment_history()
for payment in history['data']:
print(payment['txnId'], payment['personId'], payment['date'], payment['sum']['amount'])
Извлечете нужные данные из payment и добавите INSERT'ом в таблицу базы данных
Добавлю комментарии по нескольким строкам json-а, дальше, надеюсь, будет понятнее:
{
Начало json-а, все элементы, которые лежат на следующем уровне можно получить, обращаясь как к словарю (фигурная скобка - это словарь в питоне): json[key]
"data":[
Соответственно, то, что лежит в data получаем так json['data'].
Но дальше мы видим квадратную скобку, это значит в элементе json-а data лежит список, а не просто значение.
{
А тут мы видим, что первым же элементом списка, т.е. json['data'][0], начался ещё один словарь.
"txnId":12345678901,
Берём ту конструкцию, которая у нас получалась выше и обращаемся к ней как к словарю за элементом txnId: json['data'][0]['txnId']
...
"sum":{
"amount":12,
...
А тут тоже самое, что и выше, только элемент словаря другой, а в нём опять ещё один словарь (фигурная скобка): json['data'][0]['sum']['amount'].
Если сами не можете догадаться или сомневаетесь, что же там дальше, ничто не мешает вам на любом этапе остановиться, напечатать элемент до которого вы добрались, и посмотреть - а что же там дальше в нём лежит, например:
print(json['data'][0]['sum'])
Это я добрался вручную в самый первый элемент списка в 'data'. Чтобы добраться до остальных элементов этого списка, их нужно перебрать циклом for, доступ их нижележащим элементам будет точно такой же, как мы разобрались выше для первого (с индексом 0) элемента:
for item in json['data']:
print(item['sum']['amount']
Пользуясь этой методикой вы легко можете добраться до любого элемента json:
- к элементам в фигурных скобках обращаемся как к значениям словаря (по ключу)
- к элементам в квадратных скобках обращаемся как к элементам списка (по индексу, обычно мы перебираем их через
for) - через запятую идут элементы, лежащие на одном уровне
- после двоеточия идёт следующий уровень, где может лежать либо одно значение, либо словарь, либо список