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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 09:15:02