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

Enums 如何使用serde反序列化为特定的枚举变量?,enums,rust,variant,serde,Enums,Rust,Variant,Serde,我将枚举定义为: enum Foo{ Bar{x:i32,y:i32}, …//还有更多的变体 } 给定一个JSON字符串{x:5,y:7},我如何显式地反序列化到Foo::Bar{x:5,y:7} 理想情况下,我将能够调用特定变体的反序列化程序,例如我的示例中的Foo::Bar,而不是求助于像[Serdeuntaged]这样的东西,如果您事先知道要使用哪种变体,这是不合适的 我可以自己将Bar定义为一种类型,但由于它只在Foo的上下文中使用,因此它似乎不是最优雅和/或简洁的解决方案。您应该自己

我将枚举定义为:

enum Foo{ Bar{x:i32,y:i32}, …//还有更多的变体 } 给定一个JSON字符串{x:5,y:7},我如何显式地反序列化到Foo::Bar{x:5,y:7}

理想情况下,我将能够调用特定变体的反序列化程序,例如我的示例中的Foo::Bar,而不是求助于像[Serdeuntaged]这样的东西,如果您事先知道要使用哪种变体,这是不合适的

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

您应该自己将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(())
}

如果您确实知道您将拥有一个Foo::Bar,那么为什么首先要使用enum而不是让Bar本身成为一种类型呢?enum表示HTTP请求消息或路由。我从路径中知道要创建哪个消息。在本例中,Bar表示一个特定的路由,然后可以从HTTP请求体反序列化结构。