2017-05-25 38 views
2

我在函數中新分配了String,我需要創建一個派生對象,它從String中借用&str,並返回給定的對象。如何使用將在函數結尾處刪除的字符串調用時返回serde_json :: from_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; 
} 

簽名和錯誤:

error: `child` does not live long enough 
    --> src/lib.rs:88:40 
    | 
88 |  let result = serde_json::from_str(&child).ok(); 
    |          ^^^^^ does not live long enough 
89 |  return result; 
90 | } 
    | - borrowed value only lives until here 

回答

3

慣用的解決方案是任:

  • T實施DeserializeOwned代替,
  • 有兩個方法: :一個創建字符串,一個反序列化,並確保反序列化的結果是存儲d長於T

前者當然要容易得多。

相關問題