首页 > 解决方案 > 用于强类型对象的通用 serde_json 反序列化函数

问题描述

此函数来自 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行的错误消息是:

由于rustcE0277 lib.rs(1, 1)for<'de> T: models::_::_serde::Deserialize<'de>的 impl 的要求,不满足特征限制:此 de.rs(2500, 8) 中的限制要求: blocks.rs( 中的此限制要求( 62, 17): 考虑限制类型参数DeserializeOwnedTfrom_readerT

标签: rust

解决方案


您不能反序列化为“任何类型的对象”,只能反序列化为实现Deserialize<'de>or的对象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)
}

推荐阅读