TypeScript解析AlphaVantage API JSON至自定义对象的问题
AlphaVantage API 数据解析问题
问题背景
调用AlphaVantage API得到的JSON响应如下:
{ "Meta Data": { "1. Information": "Intraday (5min) open, high, low, close prices and volume", "2. Symbol": "IBM", "3. Last Refreshed": "2024-04-19 19:55:00", "4. Interval": "5min", "5. Output Size": "Compact", "6. Time Zone": "US/Eastern" }, "Time Series (5min)": { "2024-04-19 19:55:00": { "1. open": "181.5200", "2. high": "181.5800", "3. low": "181.4600", "4. close": "181.5100", "5. volume": "158" }, "2024-04-19 19:40:00": { "1. open": "181.2000", "2. high": "181.2000", "3. low": "181.2000", "4. close": "181.2000", "5. volume": "27" }, "2024-04-19 19:30:00": { "1. open": "181.5600", "2. high": "181.5600", "3. low": "181.5600", "4. close": "181.5600", "5. volume": "20" }, "2024-04-19 19:25:00": { "1. open": "181.5600", "2. high": "181.5600", "3. low": "181.5600", "4. close": "181.5600", "5. volume": "1" } } }
尝试用以下TypeScript接口存储数据:
type IntradayInterface = { metaData: MetaData; interval: { [time: string]: IntervalData }; } export type MetaData = { information: string; symbol: string; lastRefreshed: Date; interval: string; outputSize: string; timeZone: string; } export type IntervalData = { open: string; high: string; low: string; close: string; volume: string; } export default IntradayInterface;
解析函数如下:
function parseIntradayData(jsonData: any) : IntradayInterface { const metaData = jsonData['Meta Data']; let parsedMetaData : MetaData = { information: metaData['1. Information'], symbol: metaData['2. Symbol'], lastRefreshed: metaData['3. Last Refreshed'], interval: metaData['4. Interval'], outputSize: metaData['5. Output Size'], timeZone: metaData['6. Time Zone'] }; const intervalData = jsonData['Time Series (5min)']; let parsedIntervalData: IntervalData = { open: intervalData['1. open'], high: intervalData['2. high'], low: intervalData['3. low'], close: intervalData['4. close'], volume: intervalData['5. volume'] } const returnData: IntradayInterface = { metaData: parsedMetaData, interval: intervalData } return returnData; } export default parseIntradayData;
目前无法正确将JSON数据填充到IntradayInterface对象中,怀疑问题出在:
interval字段的接口定义,不知道如何正确存储每个时间戳对应的IntervalData- "Time Series (5min)"部分的解析逻辑错误
问题分析与修正
1. 核心问题梳理
- 接口定义本身没问题,但解析时直接赋值原始JSON数据会导致类型不匹配:原始时间序列的子节点键带编号(如
"1. open"),和IntervalData的键(open)不对应。 MetaData的lastRefreshed字段类型是Date,但直接赋值字符串会触发类型错误。- 解析时间序列时错误地从整个时间序列对象取字段,而非遍历每个时间戳对应的子对象。
2. 修正后的代码
接口定义(无需修改)
type IntradayInterface = { metaData: MetaData; interval: { [time: string]: IntervalData }; } export type MetaData = { information: string; symbol: string; lastRefreshed: Date; interval: string; outputSize: string; timeZone: string; } export type IntervalData = { open: string; high: string; low: string; close: string; volume: string; } export default IntradayInterface;
修正后的解析函数
function parseIntradayData(jsonData: any): IntradayInterface { // 解析元数据,将字符串时间转为Date对象 const metaData = jsonData['Meta Data']; const parsedMetaData: MetaData = { information: metaData['1. Information'], symbol: metaData['2. Symbol'], lastRefreshed: new Date(metaData['3. Last Refreshed']), interval: metaData['4. Interval'], outputSize: metaData['5. Output Size'], timeZone: metaData['6. Time Zone'] }; // 遍历时间序列,映射每个时间戳的字段 const rawTimeSeries = jsonData['Time Series (5min)']; const parsedIntervalData: { [time: string]: IntervalData } = {}; Object.keys(rawTimeSeries).forEach(timeStamp => { const rawData = rawTimeSeries[timeStamp]; parsedIntervalData[timeStamp] = { open: rawData['1. open'], high: rawData['2. high'], low: rawData['3. low'], close: rawData['4. close'], volume: rawData['5. volume'] }; }); return { metaData: parsedMetaData, interval: parsedIntervalData }; } export default parseIntradayData;
关键修正点说明
- 元数据处理:通过
new Date()将字符串格式的时间转为Date对象,符合类型定义要求。 - 时间序列处理:遍历原始时间序列的每个时间戳键,对每个时间戳下的原始数据进行字段映射,把带编号的键转换为
IntervalData的标准键,最终生成符合类型要求的时间序列对象。 - 移除了无效的单对象解析代码,改为遍历生成完整的时间戳-数据映射。
内容的提问来源于stack exchange,提问作者Rizwan Siddiqui
相关产品推荐
相关产品推荐

