Rust 如何使用可选的内部标记反序列化枚举?

Rust 如何使用可选的内部标记反序列化枚举?,rust,serde,Rust,Serde,我使用Serde反序列化用YAML编写的自定义配置文件。该文件可以包含我表示为内部标记枚举的各种定义: OfKindFoo: 种类:福 酒吧:酒吧; baz:baz; OfKindQux: 种类:曲棍球 qux:qux; 我用锈迹表示它,如下所示: #[派生(反序列化)] #[serde(tag=“kind”)] 枚举定义{ 富(富),, Qux(Qux), } #[导出(反序列化)] 结构Foo{ 酒吧:字符串, 巴兹:弦, } #[导出(反序列化)] 结构Qux{ quux:字符串, }

我使用Serde反序列化用YAML编写的自定义配置文件。该文件可以包含我表示为内部标记枚举的各种定义:

OfKindFoo: 种类:福 酒吧:酒吧; baz:baz; OfKindQux: 种类:曲棍球 qux:qux; 我用锈迹表示它,如下所示:

#[派生(反序列化)]
#[serde(tag=“kind”)]
枚举定义{
富(富),,
Qux(Qux),
}
#[导出(反序列化)]
结构Foo{
酒吧:字符串,
巴兹:弦,
}
#[导出(反序列化)]
结构Qux{
quux:字符串,
}
我希望用户能够完全省略
kind
字段,当它被省略时,Serde应该默认将其反序列化为
Foo

我开始在
定义
上实现
反序列化
。我试图将其反序列化为一个映射,并查找
kind
键,然后根据该键以及它是否存在返回相应的枚举变量

我需要以某种方式将其他映射字段的反序列化分别“转发”到
Foo::deserialize
Bar::deserialize
fn反序列化
只接受一个参数,即
反序列化器
。有没有一种方法可以将映射“转换”为反序列化程序,或者以其他方式获取在该特定映射上“启动”的反序列化程序


我无法使用,因为它会为缺少的标记返回
Err
。即使没有,文档中也指出,
other
只能应用于“单元变量”,即不包含任何数据的变量。

您可以将主枚举标记为
未标记的
,并将标记添加到确实有标记的子结构中(此功能是故意添加的,因此可能会保留)。但是,不带标记的变量应该在其他变量之后声明,因为serde将尝试使用
#[serde(untaged)]
按声明的顺序反序列化变量。另外请注意,如果在实际代码中,变量和结构具有不同的名称,或者您使用的是
#[serde(rename)]
,那么结构的名称才是(反)序列化的关键,而不是变量名称。所有这些都适用于您的示例:

#[派生(反序列化)]
#[塞尔德(未标记)]
枚举定义{
Qux(Qux),
Foo(Foo),//没有标记的变量是最后一个
}
#[导出(反序列化)]
结构Foo{
酒吧:字符串,
巴兹:弦,
}
#[导出(反序列化)]
#[serde(tag=“kind”)]
//如果您希望标记为“qux”而不是“qux”,请执行以下操作
//#[serde(rename=“qux”)]
//此处(或将`,rename=“qux”`添加到上一个serde属性)
结构Qux{
quux:字符串,
}