Rust serde Deserialize时能否自动忽略缺失的结构体字段?
解决方案
可以实现,有两种常用方案适配你的需求:
方案1:全字段缺失时自动填充类型默认值
如果你希望客户端缺传字段时,对应字段直接用该类型的默认值(比如i64默认0、String默认空字符串、Vec默认空数组),直接给结构体加#[serde(default)]注解即可:
// 注意要给结构体派生Default trait,自定义类型MusicAlbum、Artist也需要实现Default #[derive(Deserialize, Serialize, Default)] #[allow(non_snake_case)] #[serde(default)] // 缺失字段自动取对应类型的Default::default()值 pub struct PlayRecordRequest { pub id: i64, pub title: String, pub url: String, pub mvId: i64, pub album: MusicAlbum, pub artist: Vec<Artist>, }
如果只需要部分字段缺传时用默认值,也可以只给对应字段加#[serde(default)]注解,不需要全局加在结构体上。
方案2:区分「字段未传」和「字段传了默认值」
如果业务需要明确区分客户端有没有传某个字段,就把对应字段的类型改为Option<T>,缺传时字段值为None,传了则为Some(对应值):
#[derive(Deserialize, Serialize)] #[allow(non_snake_case)] pub struct PlayRecordRequest { pub id: Option<i64>, pub title: Option<String>, pub url: Option<String>, pub mvId: Option<i64>, pub album: Option<MusicAlbum>, pub artist: Option<Vec<Artist>>, }
注意点
你之前查到的skip注解作用是固定忽略某个字段的序列化/反序列化,和你需要的「有就用没有就忽略」的逻辑不符,无需使用。
内容的提问来源于stack exchange,提问作者Dolphin
相关产品推荐
相关产品推荐

