Я определяю enum ZcMapValue в качестве V для HashMap, но когда я сериализую ZcMapValue в JSON, у меня возникает проблема, мой код выглядит так, как показано ниже:

использовать serde::Serialize;
использовать std::collections::HashMap;

#[derive(Clone, Debug, Serialize)]
pub enum ZcMapValue {
    LongValue(i128),
    FloatValue(f64),
    BoolValue(bool),
    StringValue(String),
    VecValue(Vec),
    VecMapValue(Vec>),
    MapValue(HashMap),
}

fn main() {
    let mut map = HashMap::new();
    map.insert("A_B".to_string(), ZcMapValue::StringValue("a".to_string()));
    map.insert("B_C".to_string(), ZcMapValue::LongValue(128));
    let ser_js = serde_json::to_string_pretty(&map).unwrap();
    println!("{}", ser_js);
}

Когда я запускаю код, я хочу:

{"A_B": "a", "B_C": 128}

Но в результате получается:

{
  "B_C": {
    "longValue": 128
  },
  "A_B": {
    "stringValue": "a"
  }
}

Как я могу это исправить?

Ответы (1)

Для получения этого формата вы можете использовать #[serde(untagged)].

#[derive(Clone, Debug, Serialize)]
#[serde(untagged)]
pub enum ZcMapValue {
    LongValue(i128),
    FloatValue(f64),
    BoolValue(bool),
    StringValue(String),
    VecValue(Vec),
    VecMapValue(Vec>),
    MapValue(HashMap),
}

Сейчас ваш println! должен правильно выводить:

{
  "A_B": "a",
  "B_C": 128 
}

Если вы не хотите, чтобы он был красиво напечатан, то вам просто нужно использовать serde_json::to_string() вместо serde_json::to_string_pretty().

2022 WebDevInsider