Каков наилучший способ обработки потенциальных пропущенных JSON полей? - PullRequest
0 голосов
/ 12 февраля 2020

У меня есть скрипт python, который извлекает данные JSON из внешнего API. Я хочу напечатать имя, идентификационный номер и адрес электронной почты владельца для каждого словаря JSON. Но не у каждой записи есть ownerEmail, поэтому, если я пытаюсь напечатать поле, оно выдает ошибку KeyError: 'ownerEmail'. Я использовал попытку, за исключением того, чтобы обойти это:

for i in range (len(jsList)):
    try:
        print("Name: %s , ID: %s , Email: %s" % (jsList[i]['name'], jsList[i]['id'], jsList[i]['ownerEmail'] ))
    except:
        print("Name: %s , ID: %s " % (jsList[i]['name'], jsList[i]['id'] ))

Это работает, но, честно говоря, мне просто не нравится, как это выглядит. Есть ли способ изменить код так, чтобы он работал без необходимости повторять 2/3 оператора печати в другой строке?

1 Ответ

0 голосов
/ 12 февраля 2020

Лучше всего использовать функцию dict.get:

# Iterate over the items in the list directly
for entry in jsList:
    # f-strings or str.format are preferred over % formatting
    print(f"Name: {entry.get('name')}, ID: {entry.get('id')}, ...")

    # for str.format, you could do
    print("Name: {}, ID: {}, Email: {}".format(entry.get('name'), entry.get('id'), entry.get('useremail')))

Это позволит вам попытаться получить ключ без необходимости перехватывать KeyError:

a = {'name': 'John', 'lastname': 'Doe'}

print(a.get('name'))
John

print(a.get('id'))
None

print(a.get('id', 0))
0

Второй аргумент - это то, что возвращается по умолчанию, если ключ отсутствует, если он исключен, он вернет None

...