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

时间:2019-01-11 15:56:59

标签: 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>,
}

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

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

在Serde中有简单的方法可以做到这一点吗?

1 个答案:

答案 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 />元素。

这听起来确实像您想要两个不同的结构到您的文件。在这种情况下,请看以下内容: