如何在Python中解析未知键名的JSON获取最新加密货币USD价格
问题
我是编程新手,想要通过GET请求获取加密货币的JSON数据并解析出任意加密货币的最新USD价格。返回的JSON数据里,最新价格在Time Series (Digital Currency Intraday)对象的第一个条目里,但这个条目的键是动态变化的时间戳,没法直接通过键名访问。
以下是GET请求返回的JSON示例:
{ "Meta Data": { "1. Information": "Intraday Prices and Volumes for Digital Currency", "2. Digital Currency Code": "BTC", "3. Digital Currency Name": "Bitcoin", "4. Market Code": "CNY", "5. Market Name": "Chinese Yuan", "6. Interval": "5min", "7. Last Refreshed": "2018-05-19 15:50:00", "8. Time Zone": "UTC" }, "Time Series (Digital Currency Intraday)": { "2018-05-19 15:50:00": { "1a. price (CNY)": "53014.32816681", "1b. price (USD)": "8311.73569032", "2. volume": "602.25300624", "3. market cap (USD)": "5005767.80656960" }, "2018-05-19 15:45:00": { "1a. price (CNY)": "53013.58227123", // 省略其他数据 } } }
我的Python代码如下,目前能成功获取货币代码,但不知道怎么拿到时间序列里的第一个条目:
import requests APIKey = "你的API密钥" data = {'function' : 'DIGITAL_CURRENCY_INTRADAY', 'symbol' : 'BTC' , 'market' : 'CNY', 'apikey' : APIKey} r = requests.get('https://www.alphavantage.co/query?', data) data = r.json() symbol = data['Meta Data']['2. Digital Currency Code'] # 这部分没问题 print(symbol) price_data = data['Time Series (Digital Currency Intraday)'] # 怎么获取这里的第一个条目? print(price_data)
我知道这个问题不难,但网上找不到清晰的解析方法,恳请大家帮忙!
解决方案
别担心,这个问题其实很容易解决!从Python 3.7开始,字典会保留插入顺序,而Alpha Vantage返回的时间序列是按时间倒序排列的(最新的时间戳在最前面),所以我们可以直接获取字典的第一个键值对。这里给你几种实用的方法:
方法1:用next()快速获取第一个时间戳
你可以直接迭代时间序列字典的键,用next()拿到第一个(最新的)时间戳,再通过这个时间戳提取价格:
import requests APIKey = "你的API密钥" data_params = {'function' : 'DIGITAL_CURRENCY_INTRADAY', 'symbol' : 'BTC' , 'market' : 'CNY', 'apikey' : APIKey} response = requests.get('https://www.alphavantage.co/query?', params=data_params) data = response.json() # 获取货币代码 symbol = data['Meta Data']['2. Digital Currency Code'] print(f"加密货币代码: {symbol}") # 获取时间序列数据 time_series = data['Time Series (Digital Currency Intraday)'] # 拿到第一个(最新的)时间戳 latest_timestamp = next(iter(time_series.keys())) # 提取对应的USD价格 latest_usd_price = time_series[latest_timestamp]['1b. price (USD)'] print(f"最新USD价格: {latest_usd_price}")
方法2:把键转成列表取第一个元素
如果你觉得迭代的方式有点抽象,也可以把时间序列的键转换成列表,直接取索引为0的元素:
# 接上面的代码 time_series = data['Time Series (Digital Currency Intraday)'] # 转换为列表后取第一个时间戳 latest_timestamp = list(time_series.keys())[0] latest_usd_price = time_series[latest_timestamp]['1b. price (USD)'] print(f"最新USD价格: {latest_usd_price}")
更稳妥的方法:利用元数据里的刷新时间
其实API返回的Meta Data里已经有7. Last Refreshed字段,直接用这个时间戳去取价格,完全不需要依赖字典顺序,哪怕API返回的序列顺序变了也能正常工作,推荐你用这个:
# 接上面的代码 time_series = data['Time Series (Digital Currency Intraday)'] # 从元数据里直接拿最新刷新时间 latest_timestamp = data['Meta Data']['7. Last Refreshed'] latest_usd_price = time_series[latest_timestamp]['1b. price (USD)'] print(f"最新USD价格: {latest_usd_price}")
内容的提问来源于stack exchange,提问作者Ryan Bailis
相关产品推荐
相关产品推荐

