gpt4 book ai didi

json - 如何在 Rust 中反序列化来自 JSON 的 &str 结构字段

转载 作者:行者123 更新时间:2023-11-29 08:04:21 25 4
gpt4 key购买 nike

我正在反序列化来自 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没有帮助。原来没有执行 Decodable &str 的特征, 但仅适用于 String

如何将我的 JSON 反序列化为 &str结构字段?

最佳答案

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

您的错误结构包含一个&'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"),
}
}
}

问题是这是否真的是您想要的。如果您想要表示任意错误消息(而不是特定错误类型)的能力,那么您将不得不使用字符串。

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

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

关于json - 如何在 Rust 中反序列化来自 JSON 的 &str 结构字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25303227/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com