#python #python_2x
Большой JSON читается в переменную: json_response = json.loads(request.text) Есть пачка методов, которые делают различные проверки различных элементов этого JSON'а def testfoo(self, json_response): assertEquals(json_response['element']['some array'][0]['message'], 'foo') def testbar(self, json_response): assertEquals(json_response['other element']['fizz']['buzz'], 'bar') Вопрос: а можно ли "путь" внутри объекта хранить в переменной и передавать в метод как аргумент? Что-то вроде этого: def assertByPath(self, json_response, path, expected): assertEquals(path.get(json_response), expected) def testfoo(self, json_response): foopath = path(['element']['some array'][0]['message']) assertByPath(json_response, path, 'foo') def testbar(self, json_response): barpath = path(['other element']['fizz']['buzz']) assertByPath(json_response, path, 'bar') Что-то похожее предоставляет CSS Selector. UPD: есть даже аналогичный JSONSelect. А как насчет решения, которое работает не только для json, а для любого сочетания вложенных списков и словарей?
Ответы
Ответ 1
Можно "путь" просто как список передавать: import operator def get_by_path(obj, *path): return reduce(operator.getitem, path, obj) Пример: >>> get_by_path(response, 'element', 'some array', 0, 'message') 'foo' Достоинство: позволяет в качестве ключей произвольные типы использовать. Легко другой синтаксис поддерживать, если необходимо. Например, чтобы не плодить сущности без необходимости, можно использовать подмножество языка, используемого jq утилитой (если ограничиться json типами).Ответ 2
Ну, всегда можно навелосипедеть что-то свое: d = { "1": {2, 3}, "2": { "3": "foo" }, "3": { "3.1": { "foo": "bar" } } } def value_from_path(d, path): parts = path.split('/') value = d while parts: part = parts.pop(0) value = value[part] return value print(d['2']['3']) print(value_from_path(d, '2/3')) print(value_from_path(d, '3/3.1')) print(value_from_path(d, '3/3.1/foo')) print(value_from_path(d, '3')) Консоль: foo foo {'foo': 'bar'} bar {'3.1': {'foo': 'bar'}}
Комментариев нет:
Отправить комментарий