You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将复杂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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 23:45:09