gpt4 book ai didi

rust - 当显式案例不匹配时,如何将枚举扁平化为特例

转载 作者:行者123 更新时间:2023-12-03 11:38:07 25 4
gpt4 key购买 nike

我希望这样当案例不明时,它将与最后一个案例相关联

#[derive(Serialize, Deserialize, Clone, Debug)]
#[serde(untagged)]
pub enum Action {
Action1,
Action2,
Action3,
Other(String), // when not known it should be here
}

我试过使用指令

#[serde(untagged)]

但是它没有正确序列化

let b = Action::Action1;
let s = serde_json::to_string(&b);
let ss = s.unwrap();
println!("ss {:#?}", &ss);
let val = serde_json::to_value(b);
println!("ss {:#?}", &val);

结果

ss "null"
ss Ok(
Null,
)

Playground link

最佳答案

我可以想到两个相互依存的选项。

每次序列化时首先使用 From 将其转换为字符串,然后使用 From 将其转换回您自己的类型。这要求您在每次序列化和反序列化时都进行转换,但会实现您的目标。

如果您想以做更多工作为代价使 API 更简洁一些,您可以自己实现序列化和反序列化。以下是有关如何执行此操作的一些引用资料:

  1. Custom Serialization
  2. Implementing Serialize
  3. Implementing Deserialize

作为第二个选项,如果您愿意添加 serde_with 的另一个依赖项,您可以卸载自定义序列化和反序列化。 .

根据其文档:

De/Serializing a type using the Display and FromStr traits, e.g., for u8, url::Url, or mime::Mime. Check DisplayFromStr or serde_with::rust::display_fromstr for details.

关于rust - 当显式案例不匹配时,如何将枚举扁平化为特例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66046461/

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