簡體   English   中英

如何在Rust中從JSON反序列化&str結構字段

[英]How to deserialize &str struct field from JSON in 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, 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)))
      })
    })
  }
}

但是得到這個錯誤:

failed to find an implementation of trait serialize::serialize::Decodable<D,E> for &'static str

message添加生存期無濟於事。 原來&str沒有可Decodable特征的實現,而只有String可以實現

如何將JSON反序列化為&str struct字段?

引用不能序列化或反序列化。 需要一種不同的方法。

您的Error結構體包含一個&'static str 這意味着您還可以以枚舉的形式表示錯誤,可以將其序列化。 然后,您可以實現Show for Error。

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"),
        }
    }
}

問題是這是否真的是您想要的。 如果您希望能夠表示任意錯誤消息(而不是特定的錯誤類型),則必須使用String。

extern crate serialize;
use serialize::{Decodable, Encodable};

#[deriving(Encodable, Decodable)]
struct Error {
    msg: String
}

對於&'static str ,您必須具有字符串文字,該字符串在整個過程的整個生命周期內持續存在(永遠存在)。 這顯然是無法實現的。

一般而言,對於&'a str ,字節必須擁有其他內容-它通常是對String某些內容的引用(它也可能是Vec<Ascii>或外面的另一個類似UTF-8字符串類型標准庫)。 這不是序列化工作的方式-不一定將值永久存儲在任何地方,因此它不能產生引用。 這就是為什么只為String實現的原因:您根本無法為&str擁有它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM