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

使用serde_json反序列化JSON时遇类型不匹配错误求助

解决serde_json反序列化错误:"invalid type: map, expected a sequence"

错误根源

你让serde_json把返回的JSON解析成Vec<AccountSnapshot>(数组/序列),但Binance账户快照接口返回的实际是单个AccountSnapshot对象(键值对结构/Map),类型不匹配导致报错。

修复方案

只需要两处修改:

  1. 调整函数返回类型:把get_account_snapshot的返回值从Result<Vec<AccountSnapshot>, BError>改为Result<AccountSnapshot, BError>
  2. 修正反序列化目标类型:把serde_json::from_str::<Vec<AccountSnapshot>>改成serde_json::from_str::<AccountSnapshot>

修复后的核心代码

// 修复后的get_account_snapshot函数
pub async fn get_account_snapshot(api_key: &str, api_secret: &str) -> Result<AccountSnapshot, BError> {
    let credentials = Credentials::from_hmac(api_key, api_secret);
    let client = BinanceHttpClient::default().credentials(credentials);
    let request = wallet::account_snapshot("SPOT");
    let data = client.send(request).await.map_err(BError::Client)?
        .into_body_str().await.map_err(BError::Client)?;
    log::info!("Before deserialize ------> {}", data);
    // 这里把Vec<AccountSnapshot>改为AccountSnapshot
    let data = serde_json::from_str::<AccountSnapshot>(data.as_str())
        .map_err(BError::SerdeJson)?;
    Ok(data)
}

你的main函数不需要修改,因为返回的单个对象可以直接用{:#?}打印。

额外说明

你用工具生成的结构体是正确的,问题出在对API返回结构的判断上——之前处理的其他请求可能返回数组,这次惯性用了Vec,但Binance的账户快照接口返回的是单个顶层对象,以后遇到类似错误,先看日志里打印的原始JSON结构,确认是数组还是单个对象,再对应调整反序列化的类型。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 20:45:04