先核对三份信息
本次读取的官方文档中,K 线示例数组有 7 项;同一节的字段说明列出 8 项。2026 年 9 月 10 日 09:04:52.100827–09:04:52.958160 UTC 的公开 GET 响应包含两行,每行实际都是 8 项。
因此,照抄示例长度写死解析器会遇到下标问题。我们可以确认这次样本与页面中的差异,但没有验证所有币种、所有历史响应或旧版服务行为,不能把 7 项直接宣称为某个已知旧版本。
只读请求与原始样本
下面的请求只读取两根小时 K 线。即时数据会变化,复现时主要检查每行长度、类型以及相应时间戳,不应要求价格和成交量与本文完全相同。
curl -i --max-time 20 -H 'Accept: application/json' 'https://api.gateio.ws/api/v4/spot/candlesticks?currency_pair=BTC_USDT&interval=1h&limit=2'[
[
"1789027200",
"13467378.09542910",
"78112",
"78177.9",
"78039.7",
"78112",
"172.39783300",
"true"
],
[
"1789030800",
"482231.50016870",
"78185.2",
"78187.5",
"78111.9",
"78112",
"6.17099800",
"false"
]
]8 项如何对应
按本次字段说明及响应,顺序是:秒时间戳、计价币成交量、收盘价、最高价、最低价、开盘价、基础币成交量、窗口是否结束。使用从零开始的数组下标时,基础币成交量位于 row[6],结束标记位于 row[7]。
这里的价格、成交量和标记都保留为响应中的字符串。价格字段暂时不转换为普通浮点数,能避免教程无意引入精度损失;本文也没有进行金额运算。
两个容易静默出错的转换
第一项是秒时间戳;JavaScript Date 的数值参数使用毫秒。把这类秒值直接传给 new Date,会得到错误年代。先验证值,再乘以 1000。
本次最后一项是字符串 "true" 或 "false",不是 JSON 布尔值。JavaScript 中 Boolean("false") 仍为 true;判断窗口是否结束时必须做明确的字符串比较。收到其他格式时应报错并保留样本,而不是随意猜测。
function parseObservedEightFieldRow(row) {
if (!Array.isArray(row) || row.length !== 8) {
throw new Error("Unexpected candlestick row length");
}
const [seconds, quoteVolume, close, high, low, open, baseVolume, closed] = row;
if (closed !== "true" && closed !== "false") {
throw new Error("Unexpected window flag format");
}
const timestampSeconds = Number(seconds);
if (!Number.isSafeInteger(timestampSeconds)) {
throw new Error("Invalid timestamp");
}
return {
time: new Date(timestampSeconds * 1000).toISOString(),
quoteVolume, close, high, low, open, baseVolume,
isClosed: closed === "true"
};
}如何处理 7 项或未知格式
严格校验失败时,先记录准确请求、时间、行长度和原始正文,再核对对应版本文档。不要自动把某项补零,也不要把最后一个数字当布尔标记;这样会掩盖源数据与解析器之间的差异。
最近一行在本次采样中标为 "false",说明当次窗口尚未结束。它只能描述这个样本的状态,不能证明之后的数值不会修订。展示时应把“尚未结束”与完整历史数据区分开。
官方来源与公开响应
文档在 2026-09-10 核对;接口样本采集于同日 09:04:50–09:04:54 UTC。下方文件只含公开接口响应正文。
文档核对使用的文本读取服务可能包含缓存;本地直接请求文档页收到 403。网络出口位置未知,单组样本不能代表所有地区、市场或后续版本。