如何反序列化&;Rust中JSON的str struct字段
我正在从JSON反序列化结构:如何反序列化&;Rust中JSON的str struct字段,json,string,serialization,deserialization,rust,Json,String,Serialization,Deserialization,Rust,我正在从JSON反序列化结构: fn main() { let raw_json = r#"{"error": {"msg": "I am an error message"}}"#; let error: Error = json::decode(raw_json).unwrap(); } struct Error { message: &'static str } impl<D: Decoder<E>, E> Decodable<D,
fn main() {
let raw_json = r#"{"error": {"msg": "I am an error message"}}"#;
let error: Error = json::decode(raw_json).unwrap();
}
struct Error {
message: &'static str
}
impl<D: Decoder<E>, E> Decodable<D, E> for Error {
fn decode(d: &mut D) -> Result<Error, E> {
d.read_struct("error", 1, |d| {
Ok(Error{
message: try!(d.read_struct_field("msg", 0u, |d| Decodable::decode(d)))
})
})
}
}
fn main(){
让raw_json=r#“{”error:{”msg:“我是一条错误消息”}};
let error:error=json::decode(raw_json).unwrap();
}
结构错误{
消息:&'static str
}
impl可对错误进行解码{
fn解码(d:&mut d)->结果{
d、 读取结构(“错误”,1,| d |{
Ok(错误{
消息:try!(d.read_struct_字段(“msg”,0u,| d | Decodable::decode(d)))
})
})
}
}
但是得到这个错误:
未能找到trait serialize::serialize::Decodable for&'static str的实现
将生存期添加到消息中没有帮助。
事实证明,对于&str
,没有实现可解码的
特征,而只针对
如何将我的JSON反序列化为&str
结构字段?对于&'static str
,您必须有一个字符串文本,该字符串在整个进程的生命周期内(也称为永远)持续。这显然是不可能实现的
对于一般的&'a str
,必须有其他内容拥有字节,它通常是对字符串的某些内容的引用(也可能是Vec
或标准库之外的其他类似UTF-8字符串类型)。这不是序列化的工作方式,因为不一定在任何位置存储永久值,所以它不能生成引用。这就是为什么它只为字符串实现的原因:您不能将它用于&str
引用无法序列化或反序列化。需要一种不同的方法
错误结构包含一个&'static str
。这意味着您还可以以枚举的形式表示错误,枚举可以序列化。然后您可以实现错误显示
extern crate serialize;
use serialize::{Decodable, Encodable};
use std::fmt;
#[deriving(Encodable, Decodable)]
enum Error {
Foo,
Bar
}
impl fmt::Show for Error {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match *self {
Foo => write!(f, "Foo happened"),
Bar => write!(f, "Bar happened"),
}
}
}
问题是这是否真的是你想要的。如果希望能够表示任意错误消息(而不是特定的错误类型),则必须使用字符串
extern crate serialize;
use serialize::{Decodable, Encodable};
#[deriving(Encodable, Decodable)]
struct Error {
msg: String
}
谢谢你。我所有的问题都源于str和String之间缺乏理解。现在我想我终于明白了。String是存储实际字符串的位置,而&str只是其中的一个视图。对于文本,&str只是一个文本视图。所以我们不能反序列化视图,我们只能对真正的存储进行反序列化。