Получить специфицированные c значения полей из Json Python - PullRequest
0 голосов
/ 16 апреля 2020

У меня есть JSON в ответ, и я пытаюсь получить все значения "Id" и "Pages" и поместить их в массив (или список) для следующих шагов

[
{
    "Page": 1,
    "Content": [
        {"Id": 100000000000001,"Title": "title1", ...},
        {"Id": 100000000000002,"Title": "title2", ...},
        {"Id": 100000000000003,"Title": "title3", ...}
    ]
},
{
    "Page": 2,
    "Content": [
        {"Id": 100000000000004,"Title": "title4", ...},
        {"Id": 100000000000005,"Title": "title5", ...},
        {"Id": 100000000000006,"Title": "title6", ...}
    ]
},
{
    "Page": 3,
    "Content": [
        {"Id": 100000000000007,"Title": "title7", ...},
        {"Id": 100000000000008,"Title": "title8", ...},
        {"Id": 100000000000009,"Title": "title9", ...}
    ]
}

]

Получил значения "Page", используя pages = [ e['Page'] for e in data ] отсюда

Не могу получить значения "Id" . Пробовал

for el in data: print (el['Content']['Id'])

Но получил ошибку TypeError: list indices must be integers or slices, not str

Можете ли вы мне помочь?

Update1 : Извините за мой немного неправильно заданный вопрос: в качестве вывода из этого JSON я хочу вернуть массив ["id1", "id2", ..., "id9"], а не печатать

Ответы [ 3 ]

1 голос
/ 16 апреля 2020

используя списочное понимание, вы можете сделать это легко

a = [
{
    "Page": 1,
    "Content": [
        {"Id": 100000000000001,"Title": "title1",  },
        {"Id": 100000000000002,"Title": "title2",  },
        {"Id": 100000000000003,"Title": "title3",  }
    ]
},
{
    "Page": 2,
    "Content": [
        {"Id": 100000000000004,"Title": "title4",  },
        {"Id": 100000000000005,"Title": "title5",  },
        {"Id": 100000000000006,"Title": "title6",  }
    ]
},
{
    "Page": 3,
    "Content": [
        {"Id": 100000000000007,"Title": "title7",  },
        {"Id": 100000000000008,"Title": "title8",  },
        {"Id": 100000000000009,"Title": "title9",  }
    ]
}

]

res = [[i['Page'],[ j['Id'] for j in i['Content']]] for i in a]
print(res)

output

[[1, [100000000000001, 100000000000002, 100000000000003]],
 [2, [100000000000004, 100000000000005, 100000000000006]],
 [3, [100000000000007, 100000000000008, 100000000000009]]]
1 голос
/ 16 апреля 2020

Это всего лишь дополнение к уже полученным ответам, на случай, если вы встретите больше вложенных путей: jmespath облегчает обход через вложенные списки и вложения:

Путь на страницах есть данные -> список -> страница ... так что у вас есть доступ к данным, затем список, затем ключ страницы

То же самое относится к id: данные -> список -> содержимое -> список -> id

В jmespath доступ к ключу осуществляется через точку, а списки - через скобки ([]):

import jmespath
expression = jmespath.compile('[].{page:Page,id:Content[].Id}')
expression.search(data)

[{'page': 1, 'id': [100000000000001, 100000000000002, 100000000000003]},
 {'page': 2, 'id': [100000000000004, 100000000000005, 100000000000006]},
 {'page': 3, 'id': [100000000000007, 100000000000008, 100000000000009]}]

jmespath позволяет вам скомпилировать путь поиска, аналогично функциональность в python re модуле. это скорее инструмент, который нужно держать под рукой, когда вы сталкиваетесь с действительно вложенными путями.

0 голосов
/ 16 апреля 2020

Ваше поле 'Content' является list, а потенциально несколько элементов сами содержат поле 'Id'. Если вы хотите распечатать их все, вот один из способов сделать это

for element in data:
    ids = [c['id'] for c in element['Content']]
    print(ids)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...