Разбор строки JSON и сохранение в переменной

#python #json #api

#python #json #API

Вопрос:

Привет, ребята, я вызываю этот API, чтобы увидеть текущие данные о цене из Coingecko, я пытаюсь проанализировать файл json, но продолжаю получать ошибку в своем коде при использовании json.loads. Я импортировал json и все равно получаю эту ошибку

Вот фрагмент моего кода

 import json
import requests

class LivePrice(object):   #Coingecko API
    def GetPrice(self, coin):
        coinprice = coin
        Gecko_endpoint = 'https://api.coingecko.com/api/v3/simple/price?ids='
        currency  = 'amp;vs_currencies=usd'
        url = Gecko_endpoint   coinprice   currency
        r = requests.get(url, headers = {'accept': 'application/json'})
        y = json.loads(r)  
        #print(r.json()[coinprice]['usd']) 
 

если я использую эту функцию печати, я получаю цену, но я хочу иметь возможность использовать переменную и передавать ее в другой класс для выполнения некоторых вычислений

Просто пытаюсь создать простого торгового бота для развлечения, используя Alpaca API для бумажной торговли

 Traceback (most recent call last):
    File "AlapacaBot.py", line 76, in <module>
     r.GetPrice(Bitcoin)
    File "AlapacaBot.py", line 65, in GetPrice
     y = json.loads(r)  
    File "/usr/lib/python3.8/json/__init__.py", line 341, in loads
     raise TypeError(f'the JSON object must be str, bytes or bytearray, '
TypeError: the JSON object must be str, bytes or bytearray, not Response
 

Я следую примеру из w3schools, но продолжаю получать ошибку
https://www.w3schools.com/python/python_json.asp

Комментарии:

1. requests.get() возвращает Response объект. Вызовите text() его, чтобы получить тело ответа как str . Проще говоря, вы можете вызвать json() , чтобы проанализировать ее напрямую, без необходимости импортировать json отдельно.

2. «Я следую примеру из w3schools, но я продолжаю получать сообщение об ошибке» нет, это не так. Почему вы передаете Response объект json.load ? Для начала вы можете просто использовать result = r.json() . Вы могли бы сделать json.load(r.text) , хотя это в основном то же самое, что r.json()

3. Не забудьте проверить r.status_code , чтобы убедиться, что запрос выполнен успешно (200 — это нормально «хорошо»).

Ответ №1:

json.loads принимает только типы, перечисленные в вашей ошибке.

requests метод get возвращает Response объект, а не один из этих типов. Ссылка W3Schools не является заменой документации модуля запросов Python, поскольку она показывает только строки, а не Response объекты.

Объекты ответа имеют json() функцию для получения тела в виде словаря, который вы закомментировали

 r = requests.get(url, headers = {'accept': 'application/json'})
y = r.json()
print(y[coin]['usd']) 
 

Ответ №2:

Ваш код почти правильный. Вам нужно только использовать requests.json() для извлечения информации json

 import json
import requests

class LivePrice:   #Coingecko API
    def GetPrice(coin):
        coinprice = coin
        Gecko_endpoint = 'https://api.coingecko.com/api/v3/simple/price?ids='
        currency  = 'amp;vs_currencies=usd'
        url = Gecko_endpoint   coinprice   currency
        r = requests.get(url, headers = {'accept': 'application/json'})
        y = r.json()  
        print(y[coinprice]['usd']) 
LivePrice.GetPrice("bitcoin")