gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 08:32:08 25 4
gpt4 key购买 nike

我正在尝试使用 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 key 。如果我删除该选项,XML 反序列化将停止工作,因为它只接受 cubes作为关键。

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

最佳答案

我鼓励您阅读 Serde 文档。 field attributes章节介绍了 alias attribute ,强调我的:

#[serde(alias = "name")]

Deserialize this field from the given name or from its Rust name. May be repeated to specify multiple possible names for the same field.

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(())
}

I would like for a JSON file to have a cubes key with a list of cubes, but the equivalent in XML would be multiple <Cube /> elements.

这听起来确实像是您想要对您的文件使用两种不同的结构。在这种情况下,看看类似的东西:

关于rust - 我如何接受同一个 Serde 字段的多个反序列化名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54149943/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com