簡體   English   中英

如何使用 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)] ,當您事先知道要使用哪個變體時, #[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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM