如何解决我无法反序列化json字符串以使用serder进行结构化
我在将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引用了它,并且寿命比该范围更长。
我还是一个生锈的初学者,想掌握一生的概念。我试图用函数包装器解决问题以设置正确的生命周期,但是失败了。
解决方法
使用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
结构并打印。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。