我正在将一堆文档反序列化为枚举类型。我的文档有一个字段,可以用来选择正确的变体。我希望实现以下三个点:
只使用
- 如果标签与 Variant 中的某个匹配,则将其反序列化为此变体
- 如果标签不匹配,则将其反序列化为 Other 变体。
- 如果标签匹配但内容与定义的结构不匹配,则出现 panic。
只使用
#[serde(other)]
。#[derive(Deserialize)]
#[serde(tag = "type")]
enum Document {
Config {
path: PathBuf,
},
#[serde(other)]
Other,
}
通过这种方式,如果内容与Config
不匹配,则文档的内容不会被反序列化。
未标记的枚举:
#[derive(Deserialize)]
#[serde(untagged)]
enum Document {
Config {
type: String,
path: PathBuf,
},
Other(serde_yaml::Value),
}
通过这个方法,我可以获取不匹配文档的内容作为一个 Value
。不幸的是,如果有人写了一个类似于 type: Config
的文件,并且出现了打字错误,例如 paht: /etc/
,那么它将被反序列化为其他而不是抛出异常。
最后,使用嵌套枚举:
#[derive(Deserialize)]
#[serde(untagged)]
enum Document {
Config(Config),
Other(serde_yaml::Value),
}
#[derive(Deserialize)]
#[serde(tag = "type")]
enum Config {
path: PathBuf,
}
这似乎与之前的情况(简单的未标记枚举)完全相同。
当没有匹配项时,如何将Other
反序列化为serde_yaml :: Value
,如果标记匹配但结构内容不符,则会导致恐慌?
serde(other)
,这将需要一个单元类型并且无法反序列化。 - ITChap