json - 反序列化为具有枚举成员的结构

标签 json rust deserialization serde

我正在尝试获取一些如下所示的 json:

{
    "foo": "bar",
    "name": "some name"
}

并使用serde将其反序列化为这样的数据结构:

#[derive(Clone, PartialEq, Debug)]
pub struct Quux {
    foo: Foo,
    name: String,

}

pub enum Foo {
    Bar,
    Baz,
}

have some code ,但老实说,它几乎是直接来自 serde 的“不使用宏进行反序列化”指南,我不确定我需要做什么才能反序列化 foo字段为 Foo .

我已经实现了Deserialize对于 Foo枚举,我认为这对于 visitor.visit_value() 已经足够了调用我impl serde::de::Vistor for QuuxVisitor调用该版本的 deserialize ,但似乎并非如此。

当我尝试反序列化为 Quux 时遇到的错误是called 'Result::unwrap()' on an 'Err' value: SyntaxError("expected value", 2, 20) , 但如果我改变 Quux使用 String对于 foo而不是 Foo ,反序列化很好。

最佳答案

有一个 Rust 1.18/serde 1.0.0 的完整示例:

impl<'de> Deserialize<'de> for EventKind {
    fn deserialize<D>(deserializer: D) -> result::Result<EventKind, D::Error>
        where D: Deserializer<'de>
    {
        struct FieldVisitor {
            min: usize,
        };

        impl<'de> Visitor<'de> for FieldVisitor {
            type Value = EventKind;

            fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
                write!(formatter, "a string containing at least {} bytes", self.min)
            }

            fn visit_str<E>(self, value: &str) -> result::Result<EventKind, E>
                where E: serde::de::Error
            {
                let kind = match value {
                    "request" => EventKind::Request,
                    "ready" => EventKind::Ready,
                    "next" => EventKind::Next,
                    "reject" => EventKind::Reject,
                    "fail" => EventKind::Fail,
                    "done" => EventKind::Done,
                    "cancel" => EventKind::Cancel,
                    "suspended" => EventKind::Suspended,
                    s => {
                        return Err(serde::de::Error::invalid_value(serde::de::Unexpected::Str(s),
                                                                   &self));
                    }
                };
                Ok(kind)
            }
        }
        deserializer.deserialize_str(FieldVisitor { min: 4 })
    }
}

enum EventKind {
    Request,
    Ready,
    Next,
    Reject,
    Fail,
    Done,
    Cancel,
    Suspended,
}

impl Serialize for EventKind {
    fn serialize<S>(&self, serializer: S) -> result::Result<S::Ok, S::Error>
        where S: Serializer
    {
        let kind = match *self {
            EventKind::Request => "request",
            EventKind::Ready => "ready",
            EventKind::Next => "next",
            EventKind::Reject => "reject",
            EventKind::Fail => "fail",
            EventKind::Done => "done",
            EventKind::Cancel => "cancel",
            EventKind::Suspended => "suspended",
        };
        serializer.serialize_str(kind)
    }
}

可以看到类似的例子here .

关于json - 反序列化为具有枚举成员的结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35134684/

相关文章:

xml - 在TSQL中将JSON转换为XML?

java - Jersey JSON 应用程序构建失败

android - org.json.JSONObject$1 类型的 'json key object' 处的值 null 无法转换为 JSONObject

macros - 宏可以生成额外的数据吗?

rust - 奇怪的错误 : use of partially moved value

c# - 将属性名称有空格的json对象从c#发布到第三方api

Javascript 如何添加和删除 2 层深度的 JSON 元素

file - 在 Rust 中迭代文件字节的更快方法是什么?

asp.net - 为什么此JSON返回为 "Invalid JSON primitive"?

json - 如何在自定义反序列化器 Spring Boot 中读取路径变量或 URL 参数