Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rust 在FromForm中反序列化JSON时的生存期_Rust_Serde_Rust Rocket - Fatal编程技术网

Rust 在FromForm中反序列化JSON时的生存期

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解

我很难理解这段代码的生命周期之间的关系。基本上,我有一个Rocket API,它接收一些
x-www-form-urlencoded
数据,只有一个键:
json
。直观地说,这个键包含一个结构
消息
的JSON值,用百分比编码

(我知道这是次优的API设计,但这是逆向工程,所以我没有选择)

为了方便地用作请求保护,如
From
,我正在实现
FromForm
。为此,我需要从表单实现
FromForm
。我把我的impl签名写成
impl FromForm

为了实际执行解码,我:

  • 获取表单数据的
    “json”
  • URL解码值
  • 解析值中包含的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))
    }