如何使用 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?
我有一个枚举定义为:
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?