You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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对象中,怀疑问题出在:

  1. interval字段的接口定义,不知道如何正确存储每个时间戳对应的IntervalData
  2. "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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 09:31:05