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
相关产品推荐
相关产品推荐

