我正在try 编写一个通用代码,将一个json文件读入一个对象.但似乎我在这里遗漏了一些东西.

use serde::Deserialize;
use std::{error::Error, fs::File, io::Read};

pub fn from_file<'a, T>(filename: String) -> Result<T, Box<dyn Error>>
where
    T: Deserialize<'a>,
{
    let mut file = File::open(filename)?;
    let mut content: String = String::new();
    file.read_to_string(&mut content)?;
    Ok(serde_json::from_str::<T>(&content)?)
}

我收到以下错误

error[E0597]: `content` does not live long enough
  --> src\util\file.rs:11:34
   |
4  | pub fn from_file<'a, T>(filename: String) -> Result<T, Box<dyn Error>>
   |                  -- lifetime `'a` defined here
...
11 |     Ok(serde_json::from_str::<T>(&content)?)
   |        --------------------------^^^^^^^^-
   |        |                         |
   |        |                         borrowed value does not live long enough
   |        argument requires that `content` is borrowed for `'a`
12 | }
   | - `content` dropped here while still borrowed

For more information about this error, try `rustc --explain E0597`.
error: could not compile `flavour` due to previous error

我所理解的是,我必须绑定T,谢谢这SO question.但我不确定要增加哪些界限.

以及如何推断这类问题所需的界限.我试着读了from_str页,发现只需要T: de::Deserialize<'a>页.

推荐答案

LIFTIFE参数为Deserialize<'de>表示要反序列化from的数据的生命周期.出于效率原因,serde可以直接从您正在读取的 struct 中borrow 数据,例如,如果您的JSON文件包含一个字符串,而相应的Rust struct 包含&str,那么serde将直接从JSON主体中borrow 该字符串.这意味着JSON主体,至少对于Deserialize,必须至少与从它反序列化的 struct 一样长,并且该时间长度由'de Lifetime变量(在您的示例中称为'a)捕获.

如果你想在不borrow 任何东西的情况下读取数据,那么你可以 Select DeserializeOwned.从文件上看,

Trait serde::de::DeserializeOwned

无需从反序列化程序borrow 任何数据即可反序列化的数据 struct .

这主要用于函数的特征界限.例如,from_str函数可能能够反序列化从输入字符串borrow 的数据 struct ,但from_reader函数只能反序列化所拥有的数据.

因此,如果您的界限是DeserializeOwned(实际上只有for<'de> Deserialize<'de>),那么您可以从字符串without中读取数据,并borrow 其中的任何内容.事实上,因为您是从文件中读取数据,所以可以使用from_reader,它可以直接执行此操作,您甚至根本不必担心中间字符串.

Json相关问答推荐

Swift解码错误类型与`Bool`type不一致

将数组中的值作为键连接到另一个数组中的值(Jolt)

如何创建生成两个不同对象的JSON数组的SQL查询?

将部分数据字节解组到自定义 struct 中

419(未知状态)使用laravel处理PUT请求

规范化JSON数据

如何使用SQLite Trigger将JSON对象数组转换为新记录?

在 NX 工作区中跨多个应用共享 ngx-translate 翻译文件

jq - 仅在键值对存在的地方打印值

无法在 json --data 中使用变量

将 JSON 文件放在哪里以在 Angular 8 应用程序中加载静态 JSON 数据?

将嵌套的 JSON 对象规范化为 Pandas 数据框

Swift - 将图像从 URL 写入本地文件

json.dumps 打乱了顺序

如何将 LinkedHashMap 转换为自定义 java 对象?

android - 在 adb logcat 输出中格式化 json 字符串

JSON 使用 simplejson 序列化 Django 模型

如何从 JSON 响应中提取单个值?

C++:使用 nlohmann json 从文件中读取 json 对象

Javascript对象和JSON对象有什么区别