Rust 如何从字符串或数字反序列化无字段枚举?

Rust 如何从字符串或数字反序列化无字段枚举?,rust,serde,Rust,Serde,是否有一种简洁的方法可以从无字段枚举的名称或判别值反序列化其变体?e、 g.给定此枚举- enum Foo { A = 1, B = 2, C = 3, } -我想要这些字符串或数字中的任何一个来表示它: { "example-a": "a", // Foo::A "example-b": "b", // Foo::B "example-c": "c

是否有一种简洁的方法可以从无字段枚举的名称或判别值反序列化其变体?e、 g.给定此枚举-

enum Foo {
    A = 1,
    B = 2,
    C = 3,
}
-我想要这些字符串或数字中的任何一个来表示它:

{
  "example-a": "a", // Foo::A
  "example-b": "b", // Foo::B
  "example-c": "c", // Foo::C

  "example-1": 1, // Foo::A
  "example-2": 2, // Foo::B
  "example-3": 3, // Foo::C
}
我已经看到,派生
反序列化
可以容纳前一组和后一组,但我不确定如何同时容纳这两组


我认为可能存在类似于
#[serde(别名=…)]
的速记来覆盖此场景。

没有直接支持此功能的内置快捷方式。您必须手动实现
反序列化
。它既不是琐碎的,也不是超级复杂的:

impl<'de> serde::Deserialize<'de> for Foo {
    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
    where
        D: serde::Deserializer<'de>
    {
        struct FooVisitor;
        
        impl<'de> serde::de::Visitor<'de> for FooVisitor {
            type Value = Foo;
            
            fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result {
                write!(formatter, "an integer or string representing a Foo")
            }
            
            fn visit_str<E: serde::de::Error>(self, s: &str) -> Result<Foo, E> {
                Ok(match s {
                    "a" => Foo::A,
                    "b" => Foo::B,
                    "c" => Foo::C,
                    _ => return Err(E::invalid_value(serde::de::Unexpected::Str(s), &self)),
                })
            }
            
            fn visit_u64<E: serde::de::Error>(self, n: u64) -> Result<Foo, E> {
                Ok(match n {
                    1 => Foo::A,
                    2 => Foo::B,
                    3 => Foo::C,
                    _ => return Err(E::invalid_value(serde::de::Unexpected::Unsigned(n), &self)),
                })
            }
        }
        
        deserializer.deserialize_any(FooVisitor)
    }
}
impl for Foo{
fn反序列化(反序列化程序:D)->结果
哪里
D:serde::反序列化器serde::de::Visitor