Как конвертировать строку в словарь?
У меня есть функция которая обращается к Outline VPN серверу и возвращает кол-во байтов трафика использованного каждым ключом.
def get_traf(api_url):
headers = {'Content-Type': "application/json"}
url = api_url + "metrics/transfer"
numofbytes = requests.get(url, headers=headers, verify=False)
return numofbytes
Пример вывода у функции:
{"bytesTransferredByUserId":{"0":8438180}}
Когда я попытался вывести в консоль этим методом:
traf = get_traf(api_url).text
print(traf.get("bytesTransferredByUserId")
Оказалось что это не словарь, а обычная строка и я получил эту ошибку:
AttributeError: 'str' object has no attribute 'get'
Есть ли в Python способы конвертации строки в словарь?
Ответы (2 шт):
Сервис в данном случае возвращает json-строку. Для декодирования json в объект Python у результата запроса есть метод json():
response = requests.get(url, headers=headers, verify=False)
numofbytes = response.json()
Это аналогично декодированию текста результата запроса с помощью json.loads:
import json
response = requests.get(url, headers=headers, verify=False)
numofbytes = json.loads(response.text)
В документации также советуют перед вызовом .json() проверять код статус ответа (например, по условию response.status == 200 или выбрасыванием исключения response.raise_for_status()), т.к. успешное выполнение метода json() не гарантирует, что пришел ответ с правильным статусом.
И опасный ответ (так делать не рекомендуется, это просто теоретически):
real_dict = exec('{"bytesTransferredByUserId":{"0":8438180}}')
print(real_dict["bytesTransferredByUserId"])
{"0": 8438180}