Десериализация целого числа и строки для структурирования завершается неудачно, когда ввод является целым - PullRequest
0 голосов
/ 01 октября 2018

Я пытаюсь написать десериализатор, который может работать как со строковыми, так и с целочисленными входными значениями.Но происходит сбой, когда ввод является целым числом.

#[derive(Serialize, Queryable, Clone, Debug)]
#[cfg_attr(test, derive(Default))]
pub struct Obj {
    pub id: i32,
    pub name: String,
}

impl<'de> Deserialize<'de> for Obj {
    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
    where
        D: Deserializer<'de>,
    {
        struct VariantVisitor;

        impl<'de> Visitor<'de> for ObjVisitor {
            type Value = Obj;

            fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
                formatter.write_str("valid obj_id")
            }

            fn visit_i64<E>(self, value: i64) -> Result<Self::Value, E>
            where
                E: de::Error,
            {
                get_obj(value as i32).ok_or(E::custom("invalid obj id"))
            }

            fn visit_str<E>(self, value: &str) -> Result<Self::Value, E>
            where
                E: de::Error,
            {
                match get_id(value, "xyz") {
                    Ok(id) => self.visit_i64(id as i64),
                    Err(_) => Err(E::custom("invalid value")),
                }
            }
        }

        deserializer.deserialize_identifier(VariantVisitor)
    }
}

Когда ввод является {'obj': 1}, при десериализации я получаю

Ошибка: недопустимый тип: целое число 1,Ожидаемый действительный obj_id,

Когда ввод {'obj': "1"}, он работает отлично.

...