#python #json
Вопрос:
Я новичок в Python, я выполняю запрос API и получаю следующий JSON:
{
'data': {
'timelines': [{
'timestep': 'current',
'startTime': '2021-05-29T14:46:00Z',
'endTime': '2021-05-29T14:46:00Z',
'intervals': [{
'startTime': '2021-05-29T14:46:00Z',
'values': {
'temperature': 21.92
}
}]
}]
}
}
Я хочу напечатать температуру, и я прочитал, что мне нужно проанализировать JSON, чтобы использовать дату внутри него, поэтому я сделал это:
response = requests.request("GET", url, headers=headers, params=querystring)
jsonunparsed = response.json()
parsed = json.loads(jsonunparsed)
Я предполагаю, что сейчас у меня есть словарь, но когда я запускаю это
print(parsed)
У меня есть только один ключ, который называется «данные»
Наконец я решаю прокомментировать все вышесказанное и, запустив приведенный ниже код, я могу распечатать температуру
response_json = response.json()
print(response_json['data']['timelines'][0]['intervals'][0]['values']['temperature'])
Итак, мои вопросы таковы: разве не обязательно анализировать json? Почему работает мой второй вариант? когда я должен анализировать json с помощью loads() и когда я должен работать непосредственно с ним? Каковы плюсы и минусы каждого варианта? Как я мог получить температуру с помощью проанализированного json?
Спасибо
Комментарии:
1. response.json() выполняет синтаксический анализ за вас.
Ответ №1:
response.json()
уже есть разобранный JSON — requests
делает это за вас, поэтому нет необходимости использовать json.loads()
Вы используете json.loads()
, когда имеете дело со строкой, например:
unparsedJSON = "{'key': 'value'}"
parsedJSON = json.loads(unparsedJSON)
Это приведет к преобразованию строки ( unparsedJSON
) в словарь.
Если бы вы использовали response.text
вместо response.json()
этого , вы могли бы использовать json.loads()
, но поскольку запросы уже могут это сделать за вас, нет причин для этого. Однако, если бы вы это сделали, это выглядело бы так:
unparsedJSON = response.text
parsedJSON = json.loads(unparsedJSON)
Ответ №2:
response.json() уже преобразует(или анализирует) объект response в эквивалентный JSON объект Python(словарь), поэтому вам не нужен вызов json.loads(jsonunparsed), при условии, что это допустимый JSON. В противном случае это вызовет исключение.
jsonunparsed = response.json()
parsed = json.loads(jsonunparsed)
Так что вы тоже можете написать это так
jsonparsed = response.json()
print(jsonparsed['data']['timelines'][0]['intervals'][0]['values']['temperature'])