Как разобрать JSON в Python?

#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'])