首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何接受同一Serde字段的多个反序列化名称?

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

Stack Overflow用户
提问于 2019-01-11 15:56:59
回答 1查看 5.2K关注 0票数 12

我试图使用Serde反序列化基于以下结构的JSON (serde-json)和serde-xml-rs (serde-xml-rs)文件:

代码语言:javascript
复制
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 />元素。

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

在Serde有什么简单的方法来实现这一点吗?

EN

回答 1

Stack Overflow用户

发布于 2019-03-30 13:38:37

我鼓励你阅读Serde文件。字段属性一章介绍了属性,重点是:

#[serde(alias = "name")] 从给定名称或其锈名反序列化此字段。可以重复为同一字段指定多个可能的名称

代码语言:javascript
复制
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 />元素。

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

票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54149943

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档