[英]How do I configure Serde to use an enum variant's discriminant rather than name?
[英]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)]
,當您事先知道要使用哪個變體時, #[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(())
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.