Безопасное получение вложенного объекта JSON

#python #json #python-3.x

#python #json #python-3.x

Вопрос:

У меня есть вложенный файл JSON json.loads(f) :

f :

  {
     "obj1" : {
         "obj2" : [
        ... more objects
         ]
      }
    }
  

Прямо сейчас, если я хочу получить вложенный объект, я сначала получаю obj1, проверяю, нет ли его None, а затем получаю obj2

Однако это становится беспорядочным, если у меня много вложенных объектов: obj1 -> obj2 [0] -> obj3 -> obj4 [0] …..

Как я могу получить безопасность вложенного объекта, не проверяя наличие каждого объекта? Есть ли что-то вроде XPath в Python для JSON? Они могут возвращать None, если какой-либо объект не найден.

Комментарии:

1. Что вы ожидаете получить, когда один из ключей или индексов не существует? Вы можете использовать a try..except для перехвата всех ошибок значений.

2. @Selcuk Они могут вернуть None, если какой-либо объект не найден.

Ответ №1:

Канонический способ справиться с этим в Python — использовать try...except и перехватывать конкретную ошибку, в данном случае a KeyError . Если есть возможность, что вы также будете индексировать в список, вы также можете перехватить IndexError .

Например:

 d = {
    "obj1" : {
        "obj2" : [1, 2, 3]
    }
}

# Good keys
try:
    l = d['obj1']['obj2']
except KeyError:
    l = None
    
print(l)
# [1, 2, 3]

# Bad Keys
try:
    l = d['obj10']['obj100']
except KeyError:
    l = None
    
print(l)
# None

# Bad Index
try:
    l = d['obj1']['obj2'][20]
except (KeyError, IndexError):
    l = None
    
print(l)
# None
  

Это шаблон, который часто называют EAFP, проще попросить прощения, чем разрешения.