Разбор JSON с python: пустые поля

У меня возникают проблемы при разборе JSON с питоном, и теперь я застрял.
Проблема в том, что сущности моего JSON не всегда одинаковы. JSON – это что-то вроде:

"entries":[ { "summary": "here is the sunnary", "extensions": { "coordinates":"coords", "address":"address", "name":"name" "telephone":"123123" "url":"www.blablablah" }, } ] 

Я могу двигаться через JSON, например:

 for entrie in entries: name =entrie['extensions']['name'] tel=entrie['extensions']['telephone'] 

Проблема возникает из-за того, что иногда JSON не имеет всех «полей», например, telephone поля, иногда отсутствует, поэтому сценарий не работает с KeyError , поскольку в этой записи отсутствует телефонный номер .
Итак, мой вопрос: как я мог запустить этот скрипт, оставив пустое место, где отсутствует телефон ? Я пробовал:

 if entrie['extensions']['telephone']: tel=entrie['extensions']['telephone'] 

но я думаю, что это не нормально.

4 Solutions collect form web for “Разбор JSON с python: пустые поля”

Используйте dict.get вместо [] :

 entries['extensions'].get('telephone', '') 

Или просто:

 entries['extensions'].get('telephone') 

get вернет второй аргумент (по умолчанию, None ) вместо повышения KeyError когда ключ не найден.

Если данные отсутствуют только в одном месте, то dict.get может использоваться для заполнения отсутствующего значения:

 tel = d['entries'][0]['extensions'].get('telelphone', '') 

Если проблема более распространена, вы можете использовать парсер JSON вместо стандартного словаря вместо стандартного словаря или специального словаря. Например, с учетом строки JSON:

 json_txt = '''{ "entries": [ { "extensions": { "telephone": "123123", "url": "www.blablablah", "name": "name", "coordinates": "coords", "address": "address" }, "summary": "here is the summary" } ] }''' 

Разберите его с:

 >>> class BlankDict(dict): def __missing__(self, key): return '' >>> d = json.loads(json_txt, object_hook=BlankDict) >>> d['entries'][0]['summary'] u'here is the summary' >>> d['entries'][0]['extensions']['color'] '' 

В качестве примечания, если вы хотите очистить свои наборы данных и обеспечить согласованность, есть прекрасный инструмент под названием Kwalify, который выполняет проверку схемы на JSON (и на YAML);

Есть несколько полезных функций словаря, которые вы можете использовать для работы с этим.

Во-первых, вы можете использовать для проверки наличия или отсутствия ключа в словаре:

 if 'telephone' in entrie['extensions']: tel=entrie['extensions']['telephone'] 

get также может быть полезным; он позволяет указать значение по умолчанию, если отсутствует ключ:

 tel=entrie['extensions'].get('telephone', '') 

Помимо этого, вы можете посмотреть в collections.defaultdict library.defaultdict стандартной библиотеки, но это может быть излишним.

Два пути.

Один из них – убедиться, что ваши словари являются стандартными, и когда вы их читаете, у них есть все поля. Другой должен быть осторожным при доступе к словарям.

Вот пример того, как ваши словари являются стандартными:

 __reference_extensions = { # fill in with all standard keys # use some default value to go with each key "coordinates" : '', "address" : '', "name" : '', "telephone" : '', "url" : '' } entrie = json.loads(input_string) d = entrie["extensions"] for key, value in __reference_extensions: if key not in d: d[key] = value 

Вот пример осторожности при доступе к словарям:

 for entrie in entries: name = entrie['extensions'].get('name', '') tel = entrie['extensions'].get('telephone', '') 
  • Невозможно установить модуль python: ошибка PyCharm: «байт-компиляция отключена, пропущена»
  • Получить основной текст сообщения электронной почты с помощью пакета python imap и электронной почты
  • Создание частичных подмножеств в Python
  • Простая анимация 2D-координат с использованием matplotlib и pyplot
  • выбирать комбинации из нескольких списков
  • Время python os.path.getmtime () не меняется
  • python, сохраняющий имена путей с прямой и обратной косой чертой
  • Вставить элемент в отсортированный по регистру список в Python
  • Юникодное регулярное выражение для соответствия символьному классу китайских символов
  • Switch Lastname, Firstname to Firstname Фамилия внутри списка
  • Синтаксис Python 'If not'
  •  
    Interesting Posts for Van-Lav

    django-rest-framework: __init __ () принимает ровно 1 аргумент (2)

    Наименьший замкнутый круг в Python, ошибка в коде

    Односторонний тест на знакомство с Wilcoxon с использованием scipy

    Объединение массивов NumPy

    Соотношение сторон изображения с использованием Reportlab в Python

    Ошибка травления при многопоточности – проблема с дизайном или кодом?

    Размещение пользовательских изображений в окне графика – как пользовательские маркеры данных или аннотирование этих маркеров

    Чтение данных, полученных из файла FORTRAN90, в массив NUMPY

    Как заставить pip работать за прокси-сервером

    Итерация над матрицей с нулевым размером неизвестного размера

    Вложенные генераторные выражения ведут себя неожиданно

    Установка пакетов из нескольких серверов из одного или нескольких файлов требований

    Scipy редкие … массивы?

    Как использовать numpy.all () или numpy.any ()?

    Сортировка массива numpy для нескольких столбцов в Python

    Python - лучший язык программирования в мире.