Python调用Coingecko API使用json.loads解析响应报TypeError如何解决
问题解决方案
错误根因
requests.get() 执行后返回的是 requests.Response 类型的对象,而非接口返回的原始JSON字符串。json.loads() 仅支持接收字符串、字节、字节数组类型的输入参数,直接传入Response对象就会触发你遇到的TypeError。
两种修复方案
方案1:直接使用requests内置的json解析方法(更推荐)
requests库的Response对象已经内置了json()方法,内部自动完成了JSON解析逻辑,不需要你手动调用json.loads处理,代码更简洁:
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 = '&vs_currencies=usd' url = Gecko_endpoint + coinprice + currency r = requests.get(url, headers = {'accept': 'application/json'}) # 直接调用r.json()获取解析后的字典 price_data = r.json() return price_data[coinprice]['usd']
调用后可以直接拿到价格数值,存入变量即可传递给其他业务类使用。
方案2:手动调用json.loads(适配你原有写法)
如果需要手动走json.loads的解析流程,需要先获取Response对象的原始文本/字节内容,再传入loads方法:
# 把原有y = json.loads(r)替换为以下任意一行即可 y = json.loads(r.text) # 传入响应的原始字符串内容 # 或 y = json.loads(r.content) # 传入响应的原始字节内容
额外优化建议
- 可以增加异常捕获逻辑,处理请求超时、接口返回异常、币种ID不存在的情况,避免程序直接崩溃
- 注意CoinGecko的币种ID是小写格式,比如比特币的ID是
bitcoin,调用时不要传大写的Bitcoin避免匹配失败
内容的提问来源于stack exchange,提问作者marlono1
相关产品推荐
相关产品推荐

