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

问题描述 投票:0回答:1

我试图使用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有一个简单的方法来实现这一目标吗?

rust serde serde-json
1个回答
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 />元素。

这听起来好像你想要两个不同的文件结构。在这种情况下,看看像这样的东西:

© www.soinside.com 2019 - 2024. All rights reserved.