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



我有一个枚举定义为:

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(())
}
  • 当枚举变体已知时解包内部类型
  • 仅当字段是某个枚举变体时才为结构定义方法?
  • 特征可以用于枚举类型吗?
  • 如何将枚举变体作为函数参数进行匹配传递?

相关内容

  • 没有找到相关文章

最新更新