我无法反序列化json字符串以使用serder进行结构化

时间:2020-09-07 17:51:44

标签: rust serde

我在将json反序列化为结构时遇到麻烦。

这是模拟我的问题的代码:

use std::sync::mpsc;
use std::sync::mpsc::{Receiver, Sender };

extern crate serde_json;
extern crate serde;
#[macro_use]
extern crate serde_derive;

#[derive(Deserialize, Debug)]
struct Foo<'a> {
    a: u32,
    b: u32,
    c: &'a str,
}

fn main() {

    let (msg_tx, msg_rx): (Sender<Foo>, Receiver<Foo>) = mpsc::channel();
    {
        let js = r#"{"a":33, "b":44, "c": "ss"}"#; // initially I have a json String, here I simulate a problem
        let js_string = String::from(js);
        let f = test(js_string.as_str());

        msg_tx.send(f);
    }
}

fn test(js: &str) -> Foo {
    let foo: Foo = serde_json::from_str(js).unwrap();

    foo
}

运行该代码将导致错误'js' does not live long enough。 我知道将Foo c字段的类型更改为String可以解决问题,但是我想知道是否还有其他解决方案。 导致此错误的原因是在这种情况下Serde crate的工作方式-在返回的foo变量内部使用了对原始变量js_string的引用,因此在调用msg_tx.send(f);之后它就超出了范围但是f引用了它,并且寿命比该范围更长。 我还是一个生锈的初学者,想掌握一生的概念。我试图用函数包装器解决问题以设置正确的生命周期,但是失败了。

1 个答案:

答案 0 :(得分:4)

使用String代替&'a str作为c的类型。通过避免使用String引用,您不必引入生命周期。

extern crate serde_json;
extern crate serde;
#[macro_use]
extern crate serde_derive;

#[derive(Deserialize, Debug)]
struct Foo {
    a: u32,
    b: u32,
    c: String,
}

fn main() {
    let js = r#"{"a":33, "b":44, "c": "ss"}"#; 
    let foo: Foo = serde_json::from_str(js).unwrap();
    println!("{:?}", foo);

}

此代码将您的js字符串反序列化为Foo结构并打印。