Как извлечь значения из JSON файла по ключу?
Я получаю JSON файл с сервера. Mне надо с него взять определенные строки, в данном случае, вопрос и варианты ответов к нему, обработать их, и отправить боту.
Как отправить боту я понимаю, но как извлечь эти строки не понимаю, так как в начале JSON файл идет как словарь (res), потом там открывается список, а потом опять словарь. Нужны строки:
"value": "Ухаживать за животными", "value": "Обслуживать машины", "value": "Вы предпочитаете".
res = {
"description": "Выберите наиболее предпочтительный вариант ответа из предложенных",
"id": 16,
"questions": [
{
"answers": [
{
"id": 187,
"value": "Ухаживать за животными"
},
{
"id": 188,
"value": "Обслуживать машины"
}
],
"component": "SelectOneAnswer",
"direction": "row",
"id": 96,
"value": "Вы предпочитаете"
},
{
"answers": [
{
"id": 189,
"value": "Помогать больным людям, лечить их"
},
{
"id": 190,
"value": "Составлять таблицы, схемы, программы для вычислительных машин"
}
],
"component": "SelectOneAnswer",
"direction": "row",
"id": 97,
"value": "Вы предпочитаете"
},
{
"answers": [
{
"id": 191,
"value": "Участвовать в оформлении книг, плакатов, журналов"
},
{
"id": 192,
"value": "Следить за состоянием и развитием растений"
}
],
"component": "SelectOneAnswer",
"direction": "row",
"id": 98,
"value": "Вы предпочитаете"
},
{
"answers": [
{
"id": 193,
"value": "Участвовать в оформлении книг, плакатов, журналов"
},
{
"id": 194,
"value": "Следить за состоянием и развитием растений"
}
],
"component": "SelectOneAnswer",
"direction": "row",
"id": 99,
"value": "Вы предпочитаете"
}
}
Я могу получить только все, что храниться в questions, делая так:
a = res["questions"][0] и выводя это через print(a). Но а дальше, не знаю.
Ответы (2 шт):
Для того чтобы найти все значение по ключу value вне зависимости от глубины вложенности, можно воспользоваться модулем dpath:
import dpath.util as dp # pip install dpath
values = dp.values(res, "/questions/**/value")
результат:
In [13]: values
Out[13]:
['Ухаживать за животными',
'Обслуживать машины',
'Вы предпочитаете',
'Помогать больным людям, лечить их',
'Составлять таблицы, схемы, программы для вычислительных машин',
'Вы предпочитаете',
'Участвовать в оформлении книг, плакатов, журналов',
'Следить за состоянием и развитием растений',
'Вы предпочитаете',
'Участвовать в оформлении книг, плакатов, журналов',
'Следить за состоянием и развитием растений',
'Вы предпочитаете']
как правильно сделать что бы он разбивал, типа
Вы предпочитаете- это вопрос, аУхаживать за животнымииОбслуживать машиныэто два варианта ответов, как правильно это обработать и вывести?
In [33]: dp.values(res, "questions/*/answers/**/value")
Out[33]:
['Ухаживать за животными',
'Обслуживать машины',
'Помогать больным людям, лечить их',
'Составлять таблицы, схемы, программы для вычислительных машин',
'Участвовать в оформлении книг, плакатов, журналов',
'Следить за состоянием и развитием растений',
'Участвовать в оформлении книг, плакатов, журналов',
'Следить за состоянием и развитием растений']
In [34]: dp.values(res, "questions/*/value")
Out[34]:
['Вы предпочитаете',
'Вы предпочитаете',
'Вы предпочитаете',
'Вы предпочитаете']