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

Rust Rocket框架下HTTP请求反序列化如何忽略缺失的非必填字段

你遇到的报错是serde反序列化默认要求所有结构体字段在JSON中存在导致的,有两种常用实现可选字段的方案:

方案1:使用Option包裹可选字段

如果需要明确判断前端是否传递了对应字段,可将可选字段声明为Option<T>类型,缺失时字段值为None:

use rocket::serde::Deserialize;
use rocket::serde::Serialize;

#[derive(Debug, PartialEq, Eq, Deserialize, Serialize)]
#[serde(crate = "rocket::serde")]
#[allow(non_snake_case)]
pub struct LearningWordRequest {
    pub wordId: i64,
    pub word: String,
    // 未传值时自动反序列化为None
    pub wordStatus: Option<i32>
}

接口中可通过if let Some(status) = record.wordStatus的方式判断字段是否传值,再走对应逻辑。

方案2:设置字段默认值

如果不需要判断是否传值,只需要字段缺失时自动填充默认值,可使用#[serde(default)]属性:

use rocket::serde::Deserialize;
use rocket::serde::Serialize;

#[derive(Debug, PartialEq, Eq, Deserialize, Serialize)]
#[serde(crate = "rocket::serde")]
#[allow(non_snake_case)]
pub struct LearningWordRequest {
    pub wordId: i64,
    pub word: String,
    // 未传值时自动使用i32类型的默认值0
    #[serde(default)]
    pub wordStatus: i32
}

如果需要自定义默认值,可指定默认值生成函数:

use rocket::serde::Deserialize;
use rocket::serde::Serialize;

// 自定义默认值生成函数
fn get_default_word_status() -> i32 {
    2 // 示例自定义默认值
}

#[derive(Debug, PartialEq, Eq, Deserialize, Serialize)]
#[serde(crate = "rocket::serde")]
#[allow(non_snake_case)]
pub struct LearningWordRequest {
    pub wordId: i64,
    pub word: String,
    // 未传值时调用指定函数获取默认值
    #[serde(default = "get_default_word_status")]
    pub wordStatus: i32
}

注意事项

必须在结构体上添加#[serde(crate = "rocket::serde")]属性,确保使用Rocket重新导出的serde版本,避免版本不一致导致的编译错误。


内容的提问来源于stack exchange,提问作者Dolphin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 16:45:01