如何在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
相关产品推荐
相关产品推荐

