gpt4 book ai didi

enums - 使用 Serde 反序列化时,有没有办法允许未知的枚举标签?

转载 作者:行者123 更新时间:2023-12-03 11:24:22 27 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





How can I support an unknown or other value for a Serde enum?

(4 个回答)


去年关闭。




我正在反序列化一个标记的枚举:

#[derive(Deserialize)]
enum Foo {
A(A),
B(B),
C(C),
}
如果 Serde 遇到不是 A 的标签, BC ,那么它会抛出一个错误。有什么方法可以为未知标签添加一个包罗万象的变体?如果它只记录标签,我会很高兴:
#[derive(Deserialize)]
enum Foo {
A(A),
B(B),
C(C),
#[serde(unknown_tag)]
Unknown(String),
}

最佳答案

您可以使用 untagged enum为了这。细节取决于你想要做什么。这个想法是包装FooMaybeFoo ,其中 MaybeFoo有一个“通用”类型可以反序列化为第二选择。
在下面的示例中,我们使用 serde_json::Value 作为虚拟类型,作为 Deserialize 的实现是通用的,因为可以反序列化任何有效的 JSON。如果您的源格式不同,您可能需要不同的解串器或实现 Deserialize你自己。

#[derive(serde::Deserialize, serde::Serialize, PartialEq, Debug)]
enum Foo {
A(u64),
B(f32),
C(String),
}

// MaybeFoo is untagged, which also means it "looks" exactly
// like a Foo when serialized/deserialized.
#[derive(serde::Deserialize, PartialEq, Debug)]
#[serde(untagged)]
enum MaybeFoo {
Foo(Foo),
Other(serde_json::Value)
}
MaybeFoo是一个“未标记的”枚举,Serde 将尝试反序列化 MaybeFoo作为 Foo并且 - 如果失败 - 作为 serde_json::Value这将始终成功(如果来自 JSON)。
fn main() {
// Lets create a Foo and serialize it
let foo = Foo::B(0.0);
let foo_json = serde_json::to_string(&foo).unwrap();
println!("{}", &foo_json);

// Deserialize works as expected
let foo_json = "{\"B\":0.0}";
assert!(serde_json::from_str::<Foo>(&foo_json).unwrap() == foo);

// Deserializing as a `MaybeFoo` works as expected
assert!(serde_json::from_str::<MaybeFoo>(&foo_json).unwrap() == MaybeFoo::Foo(foo));

// Deserializing something else is not a `Foo`!
let foo_json = "{\"Unknown\":0.0}";
let foo = serde_json::from_str::<MaybeFoo>(&foo_json).unwrap();

// Prints "Other(Object({"Unknown": Number(0.0)}))"
println!("{:?}", &foo);
}
您可以使用 serde_json 的 API 来检查未知变体,如果它看起来像 map ,则提取标签。如果这是您唯一的兴趣, MaybeFoo 的第二个变体也可以是 HashMap<String, serde::de::IgnoredAny> ,这将反序列化任何 map ,将标签记录为 String并扔掉值(value)。然而,这假定未知值是标记值。

关于enums - 使用 Serde 反序列化时,有没有办法允许未知的枚举标签?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63560563/

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