症状
反序列化失败并报 EOF while parsing a value at line 1 column 0,或在更深处报非零列号。它与空正文或响应截断高度相关,而非合法 JSON。
诊断
在解析前检查原始正文与状态码:
let status = resp.status();
let body = resp.text().await?;
eprintln!("status={status} body={body:?}");
let value: Value = serde_json::from_str(&body)?;
列为 0 意味着输入为空;列号靠后则意味着截断或交付环节的缺陷。
修复
对空正文与非 JSON 正文做守卫:
if !status.is_success() {
return Err(format!("http {status}").into());
}
if body.trim().is_empty() {
return Ok(None); // or a defined default
}
let value = serde_json::from_str(&body)?;
验证
调用原先返回空正文的端点,不再出现 EOF 错误;再写一个反序列化空字符串的测试,断言返回清晰消息而非 serde EOF。