作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个由其他枚举组成的枚举,类似于以下内容(serde
派生并且为简洁起见省略了注释):
enum Main {
A(SubA),
B(SubB),
}
enum SubA { X1, X2, X3 }
enum SubB { Y1, Y2, Y3 }
我希望能够使用 serde
反序列化诸如“X1”或“Y3”之类的字符串,并自动取回 Main::A(SubA::X1)
或 Main::B(SubB::Y3)
。
我知道 serde
支持新类型结构上的 #[serde(transparent)]
属性,这会做我喜欢的事情。但是,它似乎只适用于结构或枚举级别,而不适用于枚举变量级别。有没有一种方法可以自动获得我正在寻找的行为?我可以确保任何包含的子枚举中的任何变体名称都不会重叠。
除了希望保持 Rust 2018 稳定版之外,我对我的项目没有其他限制,并且我愿意接受任何有帮助的 crate 建议。
最佳答案
如果您将 serde(untagged)
放在外部枚举上并且在内部枚举上没有什么特别之处,它几乎可以开箱即用:
use serde_derive::{Deserialize, Serialize};
#[derive(Debug, Deserialize, Serialize, PartialEq)]
#[serde(untagged)]
enum Main {
A(SubA),
B(SubB),
}
#[derive(Debug, Deserialize, Serialize, PartialEq)]
enum SubA { X1, X2, X3 }
#[derive(Debug, Deserialize, Serialize, PartialEq)]
enum SubB { Y1, Y2, Y3 }
fn main() {
let x1 = Main::A(SubA::X1);
let y2 = Main::B(SubB::Y2);
assert_eq!(serde_json::to_string(&x1).unwrap(), "\"X1\"");
assert_eq!(serde_json::to_string(&y2).unwrap(), "\"Y2\"");
assert_eq!(serde_json::de::from_str::<Main>("\"X1\"").unwrap(), x1);
assert_eq!(serde_json::de::from_str::<Main>("\"Y2\"").unwrap(), y2);
}
关于enums - 有没有办法在 Rust 中使用 "flatten"枚举进行(反)序列化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58532247/
我是一名优秀的程序员,十分优秀!