Rust Calamine可选解析器遇到首个空单元格即停止解析行的问题排查
问题根因
- Serde 默认规则下,即使字段是
Option类型,只要没有显式标注#[serde(default)],反序列化输入中找不到对应字段时就会直接抛出missing field错误,不会自动填充None。缺失字段的判断逻辑发生在调用自定义反序列化函数之前,所以你的空值处理逻辑根本没有机会执行。 - 你的示例代码存在一处笔误:
example2函数调用from_range时指定的泛型类型是RawExcelRowDate,和你实际定义的结构体名RawExcelRow不符,若非粘贴手误也会导致解析异常。
解决方案
步骤1:给结构体添加默认值配置
给每个Option类型字段单独加#[serde(default)],或者直接给整个结构体加该属性,告诉Serde缺失字段时使用对应类型的默认值(Option类型的默认值就是None),修改后的结构体示例:
#[derive(Serialize, Deserialize, Debug, Clone)] #[serde(default)] // 全局启用默认值规则,所有字段缺失时自动填充默认值 struct RawExcelRow { #[serde(rename = "INVOICE #", deserialize_with = "de_opt_string")] invoice_num: Option<String>, #[serde(rename = "BILLING DATE", deserialize_with = "de_opt_string")] billing_date: Option<String>, #[serde(rename = "CLIENT/PROJECT", deserialize_with = "de_opt_string")] client_project: Option<String>, #[serde(rename = "AMOUNT", deserialize_with = "de_opt_f64")] amount: Option<f64>, #[serde(rename = "DATE REC'D", deserialize_with = "de_opt_string")] date_received: Option<String>, }
步骤2:修正代码笔误
把example2函数中from_range的泛型参数RawExcelRowDate改为RawExcelRow。
验证逻辑
你现有的自定义反序列化函数已经覆盖了空单元格、错误值等场景,加上default属性后,无论是单元格为空还是行缺少对应列,都会正常返回None,不会中断解析流程,和你之前元组解析的效果完全一致。
内容的提问来源于stack exchange,提问作者ss7
相关产品推荐
相关产品推荐

