rust - 用于强类型对象的通用 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): 考虑限制类型参数DeserializeOwned
T
from_reader
T
解决方案
您不能反序列化为“任何类型的对象”,只能反序列化为实现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)
}
推荐阅读
- php - NGINX 位置回退到 Symfony
- linux - Ubuntu 服务器 - Opam 安装问题
- python - 我该如何解决这个语法错误?
- webpack-4 - css 模块查询使用最新的 css-loader 打破 css 规则
- java - 在侦听器中调用 getValue() 时,android firebase 无法实例化抽象类
- c# - Xamarin 表单绑定标签获取和设置
- sql - 在左侧或右侧将数据框与 Pandas 合并
- django - 我可以有组织地使用 django 吗?
- xml - XMLSerializer - 为什么在序列化时有一个额外的子层?
- html - 为嵌套在固定容器内的绝对位置设置 Z-index