enums - 当成员枚举标记位于最外层时,使用 serde 反序列化结构?
问题描述
我有一个包含枚举的结构,我试图使用 serde 从 YAML 反序列化:
use serde::Deserialize;
#[derive(Deserialize, Debug, PartialEq)]
struct Foo {
common: String,
#[serde(flatten)]
bar: Bar,
}
#[derive(Deserialize, Debug, PartialEq)]
#[serde(rename_all = "snake_case")]
enum Bar {
BarA(BarA),
BarB(BarB),
}
#[derive(Deserialize, Debug, PartialEq)]
struct BarA {
a: String,
}
#[derive(Deserialize, Debug, PartialEq)]
struct BarB {
b: String,
}
[dependencies]
serde = { version = "1", features = ["derive"] }
serde_yaml = "0.8"
代码可以编译,但要正确反序列化,YAML 需要如下所示:
common: Hello
bar_a:
a: World
问题是我的 YAML 看起来像这样:
bar_a:
common: Hello
a: World
请注意,枚举标记位于结构外部的最外层。如何从该格式反序列化?我的枚举相当长(20 多个变体),所以我宁愿避免任何需要更多样板代码的东西。
需要明确的是,我正在寻找通过以下测试的东西:
#[cfg(test)]
#[test]
fn test() {
let input = r#"
bar_a:
common: Hello
a: World
"#;
let foo: Foo = serde_yaml::from_str(&input).unwrap();
assert_eq!(
foo,
Foo {
common: "Hello".to_string(),
bar: Bar::BarA(BarA {
a: "World".to_string()
})
}
);
}
这里是 Rust Playground。
解决方案
推荐阅读
- c# - 在我的应用程序中禁用系统字体大小效果
- angularjs - 有没有办法在 dom 操作之后更新 Angular 绑定?
- jquery - 删除粘贴 jQuery 上的字符
- python - 在字典中查找与条件匹配的值
- java - java,没有连接到sql server
- monitoring - 使用来自不同模板的项目创建 Zabbix 触发器
- html - 如何将 mjpeg 播放为视频而不是图像?
- css - 具有两个类之一但不是两者的元素的选择器
- android - Android 应用程序在 Firebase 手机身份验证时崩溃
- codeigniter - 将 Mcrypt 库安装到谷歌云