Memory management 当使用将在函数末尾删除的字符串调用serde_json::from_str时,如何返回serde_json::from的结果?

Memory management 当使用将在函数末尾删除的字符串调用serde_json::from_str时,如何返回serde_json::from的结果?,memory-management,rust,lifetime,Memory Management,Rust,Lifetime,我在函数中有一个新分配的字符串,我需要创建一个派生对象,从该字符串借用&str,并返回给定的对象 我知道我的代码是错误的,因为String生命周期是函数的生命周期,因此派生对象将永远不会返回,因为存在悬空引用 这里的惯用解决方案是什么?我无法更改serde_json::from_str #[inline] pub fn get_object<'a, T>(json_data: &'a Value, path: &[&str]) -> Option<

我在函数中有一个新分配的
字符串
,我需要创建一个派生对象,从该
字符串
借用
&str
,并返回给定的对象

我知道我的代码是错误的,因为
String
生命周期是函数的生命周期,因此派生对象将永远不会返回,因为存在悬空引用

这里的惯用解决方案是什么?我无法更改
serde_json::from_str

#[inline]
pub fn get_object<'a, T>(json_data: &'a Value, path: &[&str]) -> Option<T>
    where T: serde::Deserialize<'a>
{
    let mut pointer_str = String::new();
    for entry in path.iter() {
        pointer_str = format!("{}/{}", pointer_str, entry);
    }

    let child = json_data.pointer(&pointer_str).unwrap().to_string();

    let result = serde_json::from_str(&child).ok();
    return result;
}

惯用的解决方案是:

  • T
    实现
    反序列化
  • 有两种方法:一种用于创建字符串,另一种用于反序列化,并确保反序列化结果的存储时间长于
    T
当然,前者要容易得多