Serde - принять несколько имен десериализации для одного поля
Я пытаюсь использовать 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 />
элементы.
Я не могу понять, как принять оба cubes
а также Cube
в качестве ключей для десериализации. Самая близкая вещь, которую я нашел, была #[serde(rename="Cube")]
вариант, но когда я использую, что десериализация JSON перестает работать, так как он принимает только Cube
ключ. Если я уберу эту опцию, десериализация XML перестанет работать, так как она принимает только cubes
как ключ.
Есть ли простой способ сделать это в Серде?
0 ответов
Я рекомендую вам прочитать документацию 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(())
}
Я хотел бы, чтобы файл JSON имел
cubes
ключ со списком кубов, но эквивалент в XML будет кратным<Cube />
элементы.
Это, конечно, звучит так, как будто вы хотите две разные структуры для ваших файлов В этом случае посмотрите на что-то вроде: