Rust 如何为同一个Serde字段接受多个反序列化名称?
我试图使用Serde根据以下结构反序列化JSON(Rust 如何为同一个Serde字段接受多个反序列化名称?,rust,serde,serde-json,Rust,Serde,Serde Json,我试图使用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&g
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>,
}
使用serde_派生::反序列化;
#[派生(调试、克隆、PartialEq、反序列化)]
pub结构模式图{
酒吧名称:String,
#[serde(rename=“Cube”)]
酒吧立方体:Vec,
}
我正在反序列化的字段根据文件类型具有不同的名称。在本例中,我希望JSON文件有一个带有多维数据集列表的cubes
键,但XML中的等价项是多个
元素
我不知道如何接受多维数据集
和多维数据集
作为反序列化的键。我找到的最接近的东西是#[serde(rename=“Cube”)]
选项,但当我使用该选项时,JSON反序列化停止工作,因为它只接受Cube
键。如果删除该选项,XML反序列化将停止工作,因为它只接受cubes
作为键
在Serde中有没有一种简单的方法可以实现这一点?我鼓励您阅读Serde文档。本章介绍了矿山的重点:
#[serde(alias=“name”)]
从给定名称或其名称反序列化此字段。也许
可以重复指定同一字段的多个可能名称
使用serde::反序列化;//1.0.88
使用serde_json;//1.0.38
#[派生(调试、反序列化)]
结构模式图{
#[serde(alias=“fancy_square”,alias=“KUBE”)]
多维数据集:[i32;3],
}
fn main()->结果{
让输入1=r#“{
“花式广场”:[1,2,3]
}"#;
让输入2=r#“{
“KUBE”:[4,5,6]
}"#;
让一个:SchemaConfig=serde_json::from_str(input1)?;
设两个:SchemaConfig=serde_json::from_str(input2)?;
println!(“{:?}”,一);
println!(“{:?}”,两个);
好(())
}
我希望JSON文件有一个带有多维数据集列表的
cubes
键,但XML中的等价项是多个
元素
这听起来好像你想要两种不同的文件结构。在这种情况下,请看以下内容:
alias
值。这里的代码示例非常清楚。
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(())
}