结构反序列化的默认行为是,当字段不以序列化形式出现时,为其分配各自的默认值。请注意,这与container
#[serde(default)]属性不同,container 属性用结构的默认值填充字段。
#[derive(Debug, PartialEq, Deserialize)]pub struct Foo<'a> { x: Option<&'a str>,}let foo: Foo = serde_json::from_str("{}")?;assert_eq!(foo, Foo { x: None });但是,当我们使用另一个反序列化函数(
#[serde(deserialize_with ="path")])时,此规则会更改。
Option这里的类型字段不再告诉反序列化器该字段可能不存在。相反,它表明存在一个字段,其内容可能为空或空(
none以Serde术语)。在
serde_json,例如,
Option<String>是Javascript相当于“任一
null或
string”(
null| string在打字稿/流量表示)。下面的代码与给定的定义和日期反序列化器可以正常工作:
let test: Test = serde_json::from_str(r#"{"i": 5, "date": null}"#)?;assert_eq!(test.i, 5);assert_eq!(test.date, None);幸运的是,仅通过添加
serde(default)属性(
Option::defaultyields
None),反序列化过程就可以变得更加宽松:
#[derive(Debug, Serialize, Deserialize)]struct Test { pub i: u64, #[serde(default)] #[serde(with = "date_serde")] pub date: Option<NaiveDate>,}操场



