如何将复杂JSON反序列化为Rust类型?Tauri序列化报错排查
解决方案:Serde无标签枚举反序列化
问题根源
你当前的枚举定义使用Serde默认序列化规则,它期望JSON数据是带变体标签的对象结构(比如{"Name": "Civil"}),但前端传递的是原始值(直接的字符串、布尔值或数字数组),因此Serde无法识别"Civil"为枚举变体,抛出未知变体错误。
修正后的类型定义
需要给CriterionValue枚举添加#[serde(untagged)]属性,让Serde根据JSON值的类型自动匹配枚举变体;同时补全Criterion结构体中缺失的label字段(前端ICriterion包含该字段):
use serde::Deserialize; #[derive(Deserialize)] pub struct SortDataInput { positive: Vec<Criterion>, negative: Vec<Criterion>, } #[derive(Deserialize)] #[serde(untagged)] // 关键属性:启用无标签枚举反序列化 pub enum CriterionValue { IntegerArray(Vec<i32>), Boolean(bool), Name(String), } #[derive(Deserialize)] pub struct Criterion { name: String, label: String, // 补全前端传入的label字段 value: CriterionValue, }
工作原理
#[serde(untagged)]会让Serde按枚举变体的顺序尝试匹配JSON值的类型:
- 若JSON值是数组(比如
[1,2,3]),匹配IntegerArray变体 - 若JSON值是布尔值(
true/false),匹配Boolean变体 - 剩下的字符串值(比如
"Civil")会匹配Name变体
注意事项
- 变体顺序很重要:如果有类型可能被误匹配(比如数字和布尔),需要把更具体的类型放在前面,但你的场景中三种类型(数组、布尔、字符串)互不重叠,顺序不影响结果
- 确保前端传递的数字数组元素是整数类型,若存在浮点数,需将
Vec<i32>改为Vec<f64>
内容的提问来源于stack exchange,提问作者TPouliquen
相关产品推荐
相关产品推荐

