如何使用 serde 反序列化为特定的枚举变体?

How do I use serde to deserialize into a specific enum variant?

我有一个枚举定义为:

enum Foo {
    Bar { x: i32, y: i32 },
    ... // many more variants
}

给定一个 JSON 字符串 {"x": 5, "y": 7} 我将如何显式反序列化为 Foo::Bar {x: 5, y: 7}

理想情况下,我可以调用特定变体的反序列化器,即我的示例中的 Foo::Bar,而不是求助于 #[serde(untagged)] 之类的东西,当您知道提前使用哪个变体。

我可以将 Bar 定义为一种类型,但由于它只在 Foo 的上下文中使用过,所以它似乎不是最优雅的 and/or简洁的解决方案。

您应该将 Bar 定义为一种类型:

#[derive(Debug, serde::Deserialize)]
enum Foo {
    Bar(Bar),
    Baz,
}

#[derive(Debug, serde::Deserialize)]
struct Bar {
    x: i32,
    y: i32,
}

fn main() -> serde_json::Result<()> {
    let bar = serde_json::from_str::<Bar>(r#"{"x": 5, "y": 7}"#)?;
    println!("{:?}", bar);
    Ok(())
}
  • Can traits be used on enum types?