用于强类型对象的通用serdejson反序列化函数



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

特征绑定的CCD_ 2不满足由于DeserializeOwnedTrustcE0277的impl的要求而需要lib.rs(1,1(:此中的绑定所必需de.rs(2500,8(:from_reader中此绑定所需blocks.rs(62,17(:考虑限制类型参数T

您不能反序列化为"任何类型化对象";,仅转换为实现CCD_ 7或CCD_。

由于您不保留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)
}

最新更新