我正在尝试使用 Serde 反序列化 JSON (serde-json
) 和 XML (serde-xml-rs
) 基于以下结构的文件:
use serde_derive::Deserialize;
#[derive(Debug, Clone, PartialEq, Deserialize)]
pub struct SchemaConfig {
pub name: String,
#[serde(rename = "Cube")]
pub cubes: Vec<CubeConfig>,
}
我要反序列化的字段根据文件类型具有不同的名称。在这种情况下,我希望 JSON 文件具有cubes
key 包含多维数据集列表,但 XML 中的等效项将是多个<Cube />
元素。
我不知道如何接受两者cubes
and Cube
作为反序列化的键。我发现的最接近的是#[serde(rename = "Cube")]
选项,但是当我使用 JSON 反序列化时,它会停止工作,因为它只接受Cube
钥匙。如果我删除该选项,XML 反序列化将停止工作,因为它只接受cubes
作为钥匙。
在 Serde 中是否有一种简单的方法可以实现这一点?
我鼓励您阅读 Serde 文档。这字段属性 https://serde.rs/field-attrs.html本章介绍了alias属性 https://serde.rs/field-attrs.html#alias,强调我的:
#[serde(alias = "name")]
从给定名称或其 Rust 名称反序列化此字段。可能
重复指定同一字段有多个可能的名称.
use serde::Deserialize; // 1.0.88
use serde_json; // 1.0.38
#[derive(Debug, Deserialize)]
struct SchemaConfig {
#[serde(alias = "fancy_square", alias = "KUBE")]
cube: [i32; 3],
}
fn main() -> Result<(), Box<std::error::Error>> {
let input1 = r#"{
"fancy_square": [1, 2, 3]
}"#;
let input2 = r#"{
"KUBE": [4, 5, 6]
}"#;
let one: SchemaConfig = serde_json::from_str(input1)?;
let two: SchemaConfig = serde_json::from_str(input2)?;
println!("{:?}", one);
println!("{:?}", two);
Ok(())
}
我希望 JSON 文件有一个cubes
key 包含多维数据集列表,但 XML 中的等效项将是多个<Cube />
元素。
这听起来确实像你想要两个不同的结构到您的文件。在这种情况下,请看以下内容:
- 如何使用 Serde 反序列化期间转换字段? https://stackoverflow.com/q/46753955/155423
- 如何序列化枚举而不包含枚举变体的名称? https://stackoverflow.com/q/52034764/155423
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)