Search code examples
rustdeserializationserde

How do I solve this error for Serde Deserialize?


Dependencies:

serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"

My code:

use serde::{Deserialize, Serialize};
use serde_json::{Result, Value};
use std::collections::HashMap;
use serde::de::Error;

#[derive(Debug)]
pub struct Log {
    pub string_map: HashMap<String, Option<String>>,
    pub number_map: HashMap<String, Option<f64>>,
    pub bool_map: HashMap<String, Option<bool>>,
}
struct Maps {
    string_map: HashMap<String, Option<String>>,
    number_map: HashMap<String, Option<f64>>,
    bool_map: HashMap<String, Option<bool>>,
}


impl Log {
    fn from_value(value: &Value) -> Option<Self> {
        let mut maps = Maps {
            string_map: HashMap::new(),
            number_map: HashMap::new(),
            bool_map: HashMap::new(),
        };
        if let Value::Object(map) = value {
            for (key, value) in map.into_iter() {
                if let Value::Number(number) = value {
                    if let Some(f) = number.as_f64() {
                        maps.number_map.insert(key.to_owned(), Some(f));
                    }
                } else if let Value::Bool(b) = value {
                    maps.bool_map.insert(key.to_owned(), Some(b.to_owned()));
                } else if let Value::String(s) = value {
                    maps.string_map.insert(key.to_owned(), Some(s.to_owned()));
                }
            }
        }
        Some(Log {
            string_map: maps.string_map,
            number_map: maps.number_map,
            bool_map: maps.bool_map,

        })
    }
}

impl<'de> Deserialize<'de> for Log {
    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
        where
            D: serde::Deserializer<'de>,
    {
        let value: Value = serde::de::Deserialize::deserialize(deserializer)?;
        match Log::from_value(&value) {
            Some(log) => Ok(log),
            None => Err(Error::custom("Failed to parse log")),
        }
    }
}

The problem here is in the deserialize implementation for Log. I am getting this error.

error[E0107]: type alias takes 1 generic argument but 2 generic arguments were supplied
src/main.rs:49:43

    |
 49 |     fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
    help: remove this generic argument
    |
    | expected 1 generic argument
    |
    note: type alias defined here, with 1 generic parameter: `T`

Solution

  • use serde_json::{Result, Value};

    You import Result from serde_json here which overrides your default prelude of std::result::Result. Either remove the import or alias it, for example: use serde_json::Result as SerdeJsonResult;