Как конвертировать строку в словарь?

У меня есть функция которая обращается к 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 шт):

Автор решения: insolor

Сервис в данном случае возвращает 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() не гарантирует, что пришел ответ с правильным статусом.

→ Ссылка
Автор решения: Victor VosMottor

И опасный ответ (так делать не рекомендуется, это просто теоретически):

real_dict = exec('{"bytesTransferredByUserId":{"0":8438180}}')
print(real_dict["bytesTransferredByUserId"])
{"0": 8438180}
→ Ссылка