【发布时间】:2021-04-22 15:07:36
【问题描述】:
我正在尝试获取枚举变体的名称,因为字符串 serde 期望/创建。例如,假设我有以下枚举:
#[derive(Serialize, Deserialize)]
#[serde(rename_all="camelCase")]
pub enum SomeEnum {
WithoutValue,
withValue(i32),
}
然后我怎样才能获得变体的 serde 名称?类似的东西
serde::key_name(SomeEnum::WithoutValue) // should be `withoutValue`
serde::key_name(SomeEnum::WithValue) // should be `withValue`
我可以对serde_json 使用 hack,对于没有值的变体我可以做:
serde_json::to_string(SomeEnum::WithoutValue).unwrap(); // yields `"withoutValue"` with quotation marks
这不是最好的解决方案,因为我需要去掉引号,但在技术上可以工作。
更糟糕的是当枚举变量有值时。它变得更加混乱。
serde_json::to_string(SomeEnum::WithValue(0)).unwrap(); // yields `"{\"second\":0}"
有没有一种干净的方法来实现这一点?我找不到将密钥名称作为字符串获取的 serde API。
【问题讨论】:
-
值得怀疑,因为重命名的字符串实际上只是
#[derive(Serialize, Deserialize)]扩展中的硬编码值。你这有什么用?也许还有另一种解决问题的方法。 -
用例是有一个带有每个枚举变量属性的 js 对象,并且需要使用变量值设置这些属性
标签: rust serde serde-json