Rust 在FromForm中反序列化JSON时的生存期
我很难理解这段代码的生命周期之间的关系。基本上,我有一个Rocket API,它接收一些Rust 在FromForm中反序列化JSON时的生存期,rust,serde,rust-rocket,Rust,Serde,Rust Rocket,我很难理解这段代码的生命周期之间的关系。基本上,我有一个Rocket API,它接收一些x-www-form-urlencoded数据,只有一个键:json。直观地说,这个键包含一个结构消息的JSON值,用百分比编码 (我知道这是次优的API设计,但这是逆向工程,所以我没有选择) 为了方便地用作请求保护,如From,我正在实现FromForm。为此,我需要从表单实现FromForm。我把我的impl签名写成impl FromForm 为了实际执行解码,我: 获取表单数据的“json”键 URL解
x-www-form-urlencoded
数据,只有一个键:json
。直观地说,这个键包含一个结构消息
的JSON值,用百分比编码
(我知道这是次优的API设计,但这是逆向工程,所以我没有选择)
为了方便地用作请求保护,如From
,我正在实现FromForm
。为此,我需要从表单实现FromForm
。我把我的impl签名写成impl FromForm
为了实际执行解码,我:
“json”
键李>
写
反序列化特征边界有两种主要方法
在impl块、函数或其他任何地方
这意味着“T可以从某个生存期反序列化。”调用者可以决定这是什么生存期。通常使用这种方法
调用方还提供正在反序列化的数据时
例如,在函数中,例如
.
例如,在这种情况下,输入数据还必须具有生存期'de
它可以是&'de str
其中T:DeserializeOwned
这意味着“T可以从任何生存期反序列化。”被调用方可以决定什么生存期。通常这是因为数据
正在从中反序列化的将在
函数返回,因此不能允许T从中借用在您的
如果数据来自URL解码某些输入,则
数据在反序列化T后被丢弃。这是另一种常见用法
绑定是从IO流反序列化的函数,例如
更严格地说,是
特质相当于
用于
。唯一的区别是反序列化拥有的
更多
直观易读。这意味着T拥有获得的所有数据
反序列化
替换T:反序列化
写反序列化特征边界有两种主要方法
在impl块、函数或其他任何地方
这意味着“T可以从某个生存期反序列化。”调用者可以决定这是什么生存期。通常使用这种方法
调用方还提供正在反序列化的数据时
例如,在函数中,例如
.
例如,在这种情况下,输入数据还必须具有生存期'de
它可以是&'de str
其中T:DeserializeOwned
这意味着“T可以从任何生存期反序列化。”被调用方可以决定什么生存期。通常这是因为数据
正在从中反序列化的将在
函数返回,因此不能允许T从中借用在您的
如果数据来自URL解码某些输入,则
数据在反序列化T后被丢弃。这是另一种常见用法
绑定是从IO流反序列化的函数,例如
更严格地说,是
特质相当于
用于
。唯一的区别是反序列化拥有的
更多
直观易读。这意味着T拥有获得的所有数据
反序列化
替换T:deserialize能否将代码放在中,以便轻松复制?乍一看,生命周期'f
和'de
@E_net4之间似乎有一种缺失的关系,不幸的是,操场上没有火箭箱。我将制作一个更完整的示例,可以粘贴到文件中。@E_net4添加了要点!你能把代码放在文件夹里,这样就可以很容易地复制吗?乍一看,生命周期'f
和'de
@E_net4之间似乎有一种缺失的关系,不幸的是,操场上没有火箭箱。我将制作一个更完整的示例,可以粘贴到文件中。@E_net4添加了要点!啊,现在我明白了。输入必须比输出长寿,这是有道理的,我不知道生命周期是如何从引用连接起来的。但是我必须同意谢普马斯特的观点,请在线回答这个问题。啊,现在我明白了。输入必须比输出长寿,这是有道理的,我不知道生命周期是如何从引用连接起来的。但我必须同意谢普马斯特的观点,请在线回答这个问题。
fn from_form(items: &mut FormItems<'f>, strict: bool) -> Result<Self, Self::Error> {
// Get JSON field
let encoded: Option<&RawStr> = items.find(|&(k, _)| k.as_str() == "json")
.map(|(_, v)| v);
if let None = encoded {
return Err(MessageFormError::MissingJsonKey);
}
// Decode URL-string
let decoded: Result<String, Utf8Error> = encoded.unwrap().url_decode();
if let Err(e) = decoded {
return Err(MessageFormError::InvalidUrl(e));
}
// Parse JSON
let json: String = decoded.unwrap();
serde_json::from_str::<Self>(&json) // Line 205
.map_err(|e| MessageFormError::InvalidJson(e))
}