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

如何在Dart中将CoinGecko OHLC接口返回的JSON解析为列表

Dart 解析CoinGecko OHLC接口返回JSON的实现方法

CoinGecko的OHLC接口返回的是标准二维数值数组,每个长度为5的子数组对应一根K线数据,字段顺序固定:

  • 索引0:毫秒级Unix时间戳(整数)
  • 索引1:开盘价
  • 索引2:最高价
  • 索引3:最低价
  • 索引4:收盘价

方法1:封装强类型模型解析(推荐)

先定义对应K线的数据类,方便后续业务逻辑调用:

class OhlcCandle {
  final DateTime dateTime;
  final double open;
  final double high;
  final double low;
  final double close;

  OhlcCandle({
    required this.dateTime,
    required this.open,
    required this.high,
    required this.low,
    required this.close,
  });
}

编写解析函数,处理类型兼容问题:

import 'dart:convert';

List<OhlcCandle> parseOhlcData(String responseBody) {
  final List<dynamic> rawData = jsonDecode(responseBody);
  return rawData.map((row) {
    final List<dynamic> candleRow = row as List<dynamic>;
    return OhlcCandle(
      // 毫秒时间戳转Dart时间对象
      dateTime: DateTime.fromMillisecondsSinceEpoch(candleRow[0] as int),
      // 用num做中转转double,兼容接口返回整数/浮点数两种情况
      open: (candleRow[1] as num).toDouble(),
      high: (candleRow[2] as num).toDouble(),
      low: (candleRow[3] as num).toDouble(),
      close: (candleRow[4] as num).toDouble(),
    );
  }).toList();
}

调用方式很简单,接口拿到响应体后直接传入解析函数即可得到类型安全的K线列表:

// 假设resp是http请求返回的响应对象
final List<OhlcCandle> ohlcList = parseOhlcData(resp.body);
// 取值示例:打印第一根K线的收盘价
print(ohlcList[0].close);

方法2:轻量解析(无需封装模型)

如果只是临时取值不需要封装类,可以直接解析成二维数值列表:

import 'dart:convert';

final List<List<num>> ohlcRawList = (jsonDecode(resp.body) as List)
    .map((row) => (row as List).map((item) => item as num).toList())
    .toList();

// 取值示例:取第二根K线的最高价
final secondCandleHigh = ohlcRawList[1][2];

注意避坑

  • 不要直接把解码结果强转成List<List<double>>,接口返回的时间戳是int类型,直接强转会抛类型异常
  • 时间戳是毫秒级,不要调用DateTime.fromMicrosecondsSinceEpoch解析,否则时间会偏差1000倍
  • 价格字段必须用num做中转转换,部分行情价格为整数时接口不会返回小数形式,直接按double强转会报错

内容的提问来源于stack exchange,提问作者amirreza ghabeli

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 21:31:10