我有一个枚举定义为:
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
上下文中使用,它似乎不是最优雅和/或简洁的解决方案。
您应该将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(())
}
- 当枚举变体已知时解包内部类型
- 仅当字段是某个枚举变体时才为结构定义方法?
- 特征可以用于枚举类型吗?
- 如何将枚举变体作为函数参数进行匹配传递?