如何为同一个 Serde 字段接受多个反序列化名称?

Mar*_*rto 5 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>,
}
Run Code Online (Sandbox Code Playgroud)

我正在反序列化的字段根据文件类型具有不同的名称。在这种情况下,我希望 JSON 文件有一个cubes包含多维数据集列表的键,但 XML 中的等效项是多个<Cube />元素。

我不知道如何同时接受cubesCube作为反序列化的键。我发现的最接近的是#[serde(rename = "Cube")]选项,但是当我使用 JSON 反序列化停止工作时,因为它只接受Cube密钥。如果我删除该选项,XML 反序列化将停止工作,因为它只接受cubes作为键。

有没有一种简单的方法可以在 Serde 中实现这一点?

She*_*ter 7

我鼓励您阅读 Serde 文档。该字段属性章介绍了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(())
}
Run Code Online (Sandbox Code Playgroud)

我希望 JSON 文件有一个cubes包含多维数据集列表的键,但 XML 中的等效项是多个<Cube />元素。

这当然听起来像是您想要两种不同的文件结构。在这种情况下,请查看以下内容:

  • 感谢您提供代码示例。我确实阅读了文档,但从文档中我不清楚如何指定多个“别名”值。您的代码示例在这里非常清楚。 (2认同)