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 /> элементы.

Это, конечно, звучит так, как будто вы хотите две разные структуры для ваших файлов В этом случае посмотрите на что-то вроде:

Другие вопросы по тегам