Извлечение данные из 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 шт):

Автор решения: gil9red

В json у вас словарь, состоящий из списка словарей, где каждый словарь это платеж. Вам нужно работать с этим как с соответствующими типами питона

Пример:

history = payment_history()
for payment in history['data']:
    print(payment['txnId'], payment['personId'], payment['date'], payment['sum']['amount'])

Извлечете нужные данные из payment и добавите INSERT'ом в таблицу базы данных

→ Ссылка
Автор решения: CrazyElf

Добавлю комментарии по нескольким строкам 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)
  • через запятую идут элементы, лежащие на одном уровне
  • после двоеточия идёт следующий уровень, где может лежать либо одно значение, либо словарь, либо список
→ Ссылка