← 中文资源

简体中文版本

Rust serde_json: 解析值时遇到 EOF

修复 serde_json 的 EOF while parsing 错误:空正文、响应被截断或按错误形状反序列化。

阅读英文原文

症状

反序列化失败并报 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。