gpt4 book ai didi

json - 如何有条件地将 JSON 反序列化为枚举的两个不同变体?

转载 作者:行者123 更新时间:2023-11-29 08:21:42 26 4
gpt4 key购买 nike

假设我有如下 JSON 数据:

{
"type": "A",
"value": [ 1, 2, 3, 4, 5 ]
}
{
"type": "B",
"value": [ [ 1, 2, 3, 4, 5 ], [ 6, 7, 8 ] ]
}

type确定 value 的类型, 在第一个例子中是 Vec<u32>第二个是Vec<Vec<u32>> .

如果我将以上数据表示如下:

enum DataValue {
TypeA(Vec<u32>),
TypeB(Vec<Vec<u32>>)
}

struct Data {
data_type: String,
value: DataValue
}

如何实现 serde 反序列化以正确解码这些值?

最佳答案

如果您向 Serde 提供足够的信息以了解如何执行此操作,则可以将您的 JSON 数据直接反序列化为 DataValue 的实例:

#[derive(Debug, Deserialize)]
#[serde(tag = "type", content = "value")]
enum DataValue {
#[serde(rename = "A")]
TypeA(Vec<u32>),
#[serde(rename = "B")]
TypeB(Vec<Vec<u32>>),
}

let data_a = r#"
{
"type": "A",
"value": [1, 2, 3, 4, 5]
}"#;
let a: DataValue = serde_json::from_str(data_a)?;

Playground

如果将枚举变量命名为 AB,则可以省略 #[serde(rename = "…")] 属性.

这种序列化枚举的方式称为“相邻标记”。您可以在 Serde documentation on enum serialization 中了解标记枚举的各种选项。 .

您的 Data 结构包含一个冗余的附加标签 data_type。此信息已编码在枚举中,因此我认为您不需要此信息。如果您需要此信息作为字符串,您可以向枚举添加一个方法:

impl DataValue {
fn variant_name(&self) -> &'static str {
match self {
DataValue::TypeA(_) => "A",
DataValue::TypeB(_) => "B",
}
}
}

关于json - 如何有条件地将 JSON 反序列化为枚举的两个不同变体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57639162/

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