首页 > 解决方案 > 当成员枚举标记位于最外层时,使用 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。

标签: enumsrustyamldeserializationserde

解决方案


推荐阅读