如何基于Serde注解获取结构体默认实例,无需手动定义?
问题:能否基于Serde注解自动生成结构体的默认实例?
假设我们有如下示例代码(实际代码包含数十个字段):
fn empty_field() -> Result<f64, String> { Err(String::new()) } #[derive(Deserialize, Serialize)] struct Record { #[serde(rename = "Apple", default)] a: f64, #[serde(rename = "Banana", default)] b: String, #[serde(rename = "Coconut", default = "empty_field")] c: Result<f64, String>, }
是否可以基于Serde注解获取该结构体的默认实例,而非像下面这样手动定义?
let empty_record = Record { a: 0.0, b: String::new(), c: Err(String::new()), };
回答
当然可以,不需要手动逐个字段赋值来创建默认实例,你可以结合Default trait和Serde的注解来自动生成:
- 首先给结构体派生
Defaulttrait,对于a、b这类本身实现了Default且用#[serde(default)]的字段,Default::default()会自动生成符合Serde默认逻辑的值(比如f64默认是0.0,String默认是空字符串)。 - 对于像
c这种指定了自定义默认函数的字段,你需要手动补充Defaulttrait的实现,调用对应的自定义函数即可。
修改后的代码示例:
fn empty_field() -> Result<f64, String> { Err(String::new()) } #[derive(Deserialize, Serialize, Default)] struct Record { #[serde(rename = "Apple", default)] a: f64, #[serde(rename = "Banana", default)] b: String, #[serde(rename = "Coconut", default = "empty_field")] c: Result<f64, String>, } // 手动实现Default,对齐Serde的自定义默认逻辑 impl Default for Record { fn default() -> Self { Self { a: Default::default(), b: Default::default(), c: empty_field(), } } }
之后你就可以直接通过Record::default()获取和手动定义完全一致的默认实例:
let empty_record = Record::default();
如果你的结构体大部分字段都用标准默认值,只有少数需要自定义,这种方式能省去大量手动赋值的重复工作。
内容的提问来源于stack exchange,提问作者lucatrv
相关产品推荐
相关产品推荐

