Не удается проанализировать данные JSON, возвращаемые между [{ и }] Python

#python #json

Вопрос:

Вот с чего я начинаю:

 url = 'https://api.example.com/'
bearer_token = 'my_token'

result = requests.get(url,headers={'Content-Type':'application/json','Authorization': 'Bearer {}'.format(bearer_token)}).json()
print(result[3])
 

Когда я печатаю type результат, который дают мои результаты JSON, я получаю «список», но я не могу проанализировать его так, как обычно делают со списком. Например, я не могу получить доступ к ключам за [ и {. Эти области, похоже, обрабатываются по-разному, когда я пытаюсь проанализировать данные из них. Некоторые значения доступны по [индексу][«ключу»], другие-нет.

Вот фрагмент моего вывода JSON, когда я print(result[3]) :

 {'created_at': 'Wed Oct 1 10:20:16  0000 2021', 'id': 1448292507, 'id_str': '1448817927', 'text': 'Lorem ipsum data data data', 'truncated': True, 'entities': {'hashtags': [{'text': 'RedLife', 'indices': [90, 101]}, {'text': 'NS18', 'indices': [102, 107]}], 'symbols': [], 'user_ment': [{'n_name': 'name_1', 'name': 'name_2', 'id': 5232, 'id_str': '32', 'indices': [12, 10]}, {'n_name': 'Lorem', 'name': 'Lorem', 'id': 1372, 'id_str': '72', 'indices': [10, 17]}, {'n_name': 'TV', 'name': 'TV', 'id': 3576, 'id_str': '76', 'indices': [55, 60]}], 'urls': [{'url': 'https://website.com', 'expanded_url': 'https://website'...}
 

Когда я print(result[3]['created_at']) , я получаю Wed Oct 1 10:20:16 0000 2021 . Отлично!

Когда я пробую другие ключи в списке, я получаю KeyError s.

Что мне нужно сделать с данными JSON, чтобы получить все необходимые данные? И в случае, когда существует несколько экземпляров одного и того же «ключа», как мне получить «значение», которое я ищу? Могу ли я просто добавить нужный мне индекс следующим образом: print(result[3]['n_name'][0]) ?

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

1. Можете ли вы указать, какие ключи вы пытаетесь использовать? Часто ключи вложены больше, чем вы ожидали!

2. У объекта не было бы дубликатов ключей. Как указано выше, воспринимаемый дубликат должен быть вложенным.

3. @VincentBuscarello они действительно кажутся вложенными. Для примера предположим, что я ищу второе «n_name» и «расширенное имя»

4. Когда дело доходит до вложенных данных, подобных этому, медленно переходите по одному слою за раз, печатая каждый элемент. Обычно неправильно то, что вы пытаетесь относиться к списку как к словарю или наоборот.

5. Что — то вроде print(result[0]['entities']['user_ment'][0]['n_name']) должно сработать, но я уверен, что у тебя это уже есть

Ответ №1:

Для доступа n_name вам не хватает 'entities' и 'user_ment' уровней в диктанте , затем у вас есть список, затем снова список

 result = [
    {},
    {},
    {},
    {'created_at': 'Wed Oct 1 10:20:16  0000 2021', 'id': 1448292507,
     'id_str': '1448817927',
     'text': 'Lorem ipsum data data data', 'truncated': True,
     'entities': {
         'hashtags': [{'text': 'RedLife', 'indices': [90, 101]}, {'text': 'NS18', 'indices': [102, 107]}],
         'symbols': [],
         'user_ment': [
             {'n_name': 'name_1', 'name': 'name_2', 'id': 5232, 'id_str': '32', 'indices': [12, 10]},
             {'n_name': 'Lorem', 'name': 'Lorem', 'id': 1372, 'id_str': '72', 'indices': [10, 17]},
             {'n_name': 'TV', 'name': 'TV', 'id': 3576, 'id_str': '76', 'indices': [55, 60]}
         ],
         'urls': [{'url': 'https://website.com', 'expanded_url': 'https://website'}]
     }}
]

x = result[3]['entities']['user_ment'][0]['n_name']
print(x)  # name_1

x = result[3]['entities']['user_ment'][1]['n_name']
print(x)  # Lorem
 

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

1. К сожалению, это вызывает ошибку типа: индексы списка должны быть целыми числами или срезами, а не str

2. Я могу начать только с индекса по целому числу, начиная с индекса по str, что приводит к ошибке

3. @Micadeli конечно, данные , которые я показываю, принадлежат непосредственно вам result[3] , см. Мое редактирование