LINUX.ORG.RU

Как правильно обрабатывать json-ответы

 ,


0

1

Скажем, есть url http://api.example.com/someoperation?params&apikey=123456, при обращении к которому при правильном apikey можно получить некоторые данные в формате json.

Вложенность этих данных (объект в списке, которые в объекте, который в списке, нутыпонел) может быть разной.

Естественно, структура ответа мы знаем из документации сервиса.

Внимание, вопрос: как лучше всего обрабатывать такие ответы?

Стоит ли делать кучу вложенных if, чтобы проверить, что все требуемые ключи есть в ответе, или забить, и обращаться сразу в виде answer[key1][key2][key3], предполагая, что key1, key2 и key3 всегда есть в ответе и не стоит лишний раз заморачиваться с проверкой ошибок?

В частности, обработка идет на python.


проще - обернуть dict во что-нибудь, само разруливающее это, (а для json.loads использовать object_pairs_hooks) и обращаться, как к answer.key1.key2.key3

а как правильно - я не знаю.

feofil
()
Ответ на: комментарий от crowbar

Т.е. не куча if'ов, а try-catch, а там гори оно синим пламенем, если сервис в один прекрасный день начнет возвращать ответы другого формата?

getup
() автор топика
Ответ на: комментарий от crowbar

В try-catch оберни, это python-way.

гвидобейсик и вижуалбейсик - это разные бейсики, не нужно их путать.

feofil
()

Пожалуй, try-catch подойдет.

getup
() автор топика
Ответ на: комментарий от getup

тогда уж сразу a.get('key1',{}).get('key2',{}).get('key3',{})

я этой строчкой детей пугаю, когда спать ложиться не хотят

feofil
()
Ответ на: комментарий от crowbar

Кстати это действительно логично, смена API — вполне исключительная ситуация.

crowbar
()
Ответ на: комментарий от crowbar

Перехватить и НЕ игнорировать.

getup
() автор топика

У словарей в питоне есть метод get, ну или можно просто try/catch вокруг обработчика. Проверкой ошибок лишний раз заморачиваться незачем, но т.к. ни одна документация не бывает полной, то лучше добавить какое-нибудь журналирование ошибок.

Распарсить нужные данные лучше в одном месте, чтобы в случае ошибки падало там же, а не где-то ещё.

quiet_readonly ★★★★
()
Последнее исправление: quiet_readonly (всего исправлений: 1)
Ответ на: комментарий от getup

Т.е. не куча if'ов, а try-catch, а там гори оно синим пламенем, если сервис в один прекрасный день начнет возвращать ответы другого формата?

В C++/Objective-C решал это так: все известные ошибки отображаются в строке ошибки красным цветом, а в дополнение

  • если сервер вернул статус 500, пишется error on server side
  • если ответ сервера неожиданный или он неожиданно вернул ошибку (400 Bad Request с характерным ответом в JSON), пишется application is outdated and cannot work correctly
quiet_readonly ★★★★
()

Правильно — использовать схему для валидации приходящих данных.

Вот пример валидатора, наверняка есть реализации для педона.

Apple-ch ★★
()

правильное как написали выше - валидатор схемы, простой и быстрый вариант сделать через try..catch и забыть

umren ★★★★★
()
Ответ на: комментарий от Apple-ch

Несмотря на то, что этому регистранту даже один запрос в гугл вбить лень, я его поддерживаю и от себя предложу jsonschema или validictory.

anonymous
()
def haskeydeep(obj, *names):
    for name in names:
        if not hasattr(obj, '__iter__'): return False
        if not name in obj:
            return False
        obj = obj[name]
    return True

foo = {'a': {'a1': {'a2': 'bar'}}, 'b': 2}
print haskeydeep(foo, *['a'])
print haskeydeep(foo, *['a', 'a1'])
print haskeydeep(foo, *['a', 'a1', 'a2'])
print haskeydeep(foo, *['a', 'a1', 'a2', 'a3'])
uralbash
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.