如何反序列化&;Rust中JSON的str struct字段

如何反序列化&;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,

我正在从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, 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只是一个文本视图。所以我们不能反序列化视图,我们只能对真正的存储进行反序列化。