使用serde_json反序列化JSON时遇类型不匹配错误求助
解决serde_json反序列化错误:"invalid type: map, expected a sequence"
错误根源
你让serde_json把返回的JSON解析成Vec<AccountSnapshot>(数组/序列),但Binance账户快照接口返回的实际是单个AccountSnapshot对象(键值对结构/Map),类型不匹配导致报错。
修复方案
只需要两处修改:
- 调整函数返回类型:把
get_account_snapshot的返回值从Result<Vec<AccountSnapshot>, BError>改为Result<AccountSnapshot, BError> - 修正反序列化目标类型:把
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
相关产品推荐
相关产品推荐

