我正在尝试使用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
键和一个多维数据集列表,但XML中的等效项将是多个<Cube />
元素。
我不知道如何接受cubes
和Cube
作为反序列化的密钥。我发现最接近的是#[serde(rename = "Cube")]
选项,但是当我使用该选项时,JSON反序列化将停止工作,因为它仅接受Cube
键。如果删除该选项,则XML反序列化将停止工作,因为它仅接受cubes
作为密钥。
在Serde中有简单的方法可以做到这一点吗?
答案 0 :(得分:0)
我建议您阅读Serde文档。 field attributes这一章介绍了alias
attribute,重点是我的:
#[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
键和一个多维数据集列表,但XML中的等效项将是多个<Cube />
元素。
这听起来确实像您想要两个不同的结构到您的文件。在这种情况下,请看以下内容: