如何从API返回的JSON响应中提取特定字段(如lastPrice)?
问题:如何修改Flask接口仅返回API响应的特定字段?
我是编程新手,以下是我用于从API请求数据的Flask代码:
@app.route('/quote/{symbol}') def quote(symbol): response = c.get_quote(symbol) return response.json()
API返回的JSON响应如下:
{"SPY":{"assetType":"ETF","assetMainType":"EQUITY","cusip":"78462F103","assetSubType":"ETF","symbol":"SPY","description":"SPDR S&P 500","bidPrice":390.2,"bidSize":300,"bidId":"P","askPrice":390.21,"askSize":100,"askId":"P","lastPrice":389.02,"lastSize":2528800,"lastId":"P","openPrice":379.87,"highPrice":389.52,"lowPrice":379.68,"bidTick":" ","closePrice":389.02,"netChange":0.0,"totalVolume":100301958,"quoteTimeInLong":1667001600168,"tradeTimeInLong":1667001600004,"mark":389.02,"exchange":"p","exchangeName":"PACIFIC","marginable":true,"shortable":true,"volatility":0.0109,"digits":2,"52WkHigh":479.98,"52WkLow":348.11,"nAV":0.0,"peRatio":0.0,"divAmount":6.1757,"divYield":1.59,"divDate":"2022-09-16 00:00:00.000","securityStatus":"Normal","regularMarketLastPrice":389.02,"regularMarketLastSize":30,"regularMarketNetChange":0.0,"regularMarketTradeTimeInLong":1667001600004,"netPercentChangeInDouble":0.0,"markChangeInDouble":0.0,"markPercentChangeInDouble":0.0,"regularMarketPercentChangeInDouble":0.0,"delayed":false,"realtimeEntitled":true}}
请问如何修改代码,让接口仅返回响应体中的特定部分,比如lastPrice字段?
解决方案
首先修正路由参数的写法——Flask里路由变量要用尖括号<>,不是大括号{},否则没法正确捕获symbol参数。然后解析API返回的JSON数据,逐层提取lastPrice字段即可,具体修改后的代码如下:
@app.route('/quote/<symbol>') def quote(symbol): response = c.get_quote(symbol) data = response.json() # 先通过symbol键拿到对应股票的数据块,再提取lastPrice last_price = data[symbol]['lastPrice'] # 返回只包含lastPrice的JSON响应 return {'lastPrice': last_price}
额外说明:
- 如果需要返回多个特定字段,比如同时获取
lastPrice和bidPrice,可以扩展返回的字典:
return { 'lastPrice': data[symbol]['lastPrice'], 'bidPrice': data[symbol]['bidPrice'] }
- 为了防止API返回结构变更或股票代码不存在导致的报错,可以加个简单的异常处理:
@app.route('/quote/<symbol>') def quote(symbol): response = c.get_quote(symbol) data = response.json() try: return {'lastPrice': data[symbol]['lastPrice']} except KeyError: return {'error': '无法获取目标字段或股票代码无效'}, 404
内容的提问来源于stack exchange,提问作者topski
相关产品推荐
相关产品推荐

