Разбор 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 SciPy IndexError: длина границ несовместима с длиной x0
  • Как структурировать программу для работы с конфигурациями тральщика
  • реализовать raw_input в моем алгоритме
  • Возможно ли изменить переменную в python, которая находится во внешней, но не глобальной области?
  • Python - Цезарь Шифр
  • Python Pandas преобразует тип данных столбца
  • Обнаружение и отслеживание всего тела с использованием OpenCV + Python-2.7
  • Как перенести первую букву слова в конец
  •  
    Interesting Posts for Van-Lav
    Python - лучший язык программирования в мире.