【问题标题】:generic serde_json deserialize function for strongly typed objects用于强类型对象的通用 serde_json 反序列化函数
【发布时间】:2021-08-05 03:55:22
【问题描述】:

此函数来自 serde_json 文档:

fn read_user_from_file<P: AsRef<Path>>(path: P) -> Result<User, Box<dyn Error>> {
    // Open the file in read-only mode with buffer.
    let file = File::open(path)?;
    let reader = BufReader::new(file);

    // Read the JSON contents of the file as an instance of `User`.
    let u = serde_json::from_reader(reader)?;

    // Return the `User`.
    Ok(u)
}

我想让它更通用,这样我就可以反序列化为任何类型的对象。然后,我可以将该函数用于多个对象。

fn read_user_from_file<T,P: AsRef<Path>>(path: P) -> Result<T, Box<dyn Error>> {
    // Open the file in read-only mode with buffer.
    let file = File::open(path)?;
    let reader = BufReader::new(file);

    let t:T = serde_json::from_reader(reader)?;

    // Return the `User`.
    Ok(t)
}

但是serde_json::from_reader 行上的错误消息是:

trait bound for&lt;'de&gt; T: models::_::_serde::Deserialize&lt;'de&gt; 不满足 需要,因为对 DeserializeOwned 的 impl 的要求 TrustcE0277 lib.rs(1, 1):在这个范围内需要 de.rs(2500, 8):from_reader 中的此绑定所需 blocks.rs(62, 17):考虑限制类型参数T

【问题讨论】:

    标签: rust


    【解决方案1】:

    您不能反序列化为“任何类型的对象”,只能反序列化为实现Deserialize&lt;'de&gt;DeserializeOwned 的对象。

    由于您不保留 JSON,因此您想使用DeserializeOwned

    fn read_user_from_file<T, P>(path: P) -> Result<T, Box<dyn Error>>
    where
        T: DeserializeOwned,
        P: AsRef<Path>,
    {
        // Open the file in read-only mode with buffer.
        let file = File::open(path)?;
        let reader = BufReader::new(file);
    
        let t:T = serde_json::from_reader(reader)?;
    
        // Return the `User`.
        Ok(t)
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-01-06
      • 1970-01-01
      • 2020-05-24
      • 1970-01-01
      • 1970-01-01
      • 2012-10-15
      • 1970-01-01
      相关资源
      最近更新 更多