我试图使用Serde反序列化基于以下结构的JSON (serde-json)和serde-xml-rs (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密钥,但是在<Cube />中等效的是多个<Cube />元素。
我不知道如何同时接受cubes和Cube作为反序列化的键。我发现的最接近的是#[serde(rename = "Cube")]选项,但是当我使用该选项时,JSON反序列化停止工作,因为它只接受Cube键。如果删除该选项,XML反序列化将停止工作,因为它只接受cubes作为键。
在Serde有什么简单的方法来实现这一点吗?
发布于 2019-03-30 13:38:37
我鼓励你阅读Serde文件。字段属性一章介绍了属性,重点是:
#[serde(alias = "name")]从给定名称或其锈名反序列化此字段。可以重复为同一字段指定多个可能的名称。
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密钥,但是在<Cube />中等价的是多个<Cube />元素。
这听起来确实像是您想要两种不同的结构到您的文件。在这种情况下,请看以下内容:
https://stackoverflow.com/questions/54149943
复制相似问题