首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Serde:使用容器#[serde(默认)],但需要一些必需的字段

Serde:使用容器#[serde(默认)],但需要一些必需的字段
EN

Stack Overflow用户
提问于 2021-01-22 11:19:37
回答 1查看 5.5K关注 0票数 6

我有一个使用the #[serde(default)] container attribute的结构。

但是应该需要一个字段(如果传入数据中不存在这个字段,反序列化器应该出错,而不是返回到默认值)。

代码语言:javascript
复制
#[serde(default)]
#[derive(Serialize, Deserialize)]
struct Example {
  important: i32, // <-- I want this field to be required.
  a: i32, //  <-- If this field isn't in the incoming data, fallback to the default value.
  b: i32, //  <-- If this field isn't in the incoming data, fallback to the default value.
  c: i32, //  <-- If this field isn't in the incoming data, fallback to the default value.
}

编辑:

下面的信息不正确。#[serde(default)]字段属性不接受struct类型的默认值,而是每个字段的类型。(即不使用impl Default for Example。使用impl Default for i32 )。

End编辑.

我可以像这样使用the #[serde(default)] field attribute

代码语言:javascript
复制
#[derive(Serialize, Deserialize)]
struct Example {
  important: i32,
  #[serde(default)]
  a: i32,
  #[serde(default)]
  b: i32,
  #[serde(default)]
  c: i32,
}

因此,important是必需的,而abc则有默认值。

但是,除了一个字段之外,复制粘贴#[serde(default)]似乎不是一个好的解决方案(我的结构有10个字段)。有更好的办法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-30 22:58:34

响应您的编辑,您可以利用#[serde(default = "path")]为每个字段设置默认值。路径指向返回该字段默认值的函数。

参考资料:https://serde.rs/field-attrs.html

示例:

代码语言:javascript
复制
const A_DEFAULT: i32 = 1;
const B_DEFAULT: i32 = 2;
const C_DEFAULT: i32 = 3;

#[derive(Serialize, Deserialize)]
struct Example {
  important: i32,
  #[serde(default = "a_default")]
  a: i32,
  #[serde(default = "b_default")]
  b: i32,
  #[serde(default = "c_default")]
  c: i32,
}

fn a_default() -> i32{
  A_DEFAULT
}
fn b_default() -> i32{
  B_DEFAULT
}
fn c_default() -> i32{
  C_DEFAULT
}
票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65844153

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档