#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]
, см. Мое редактирование