![](/img/trans.png)
[英]How to deserialize JSON object of multiple key value entries to custom struct in Rust
[英]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.