0

Is it possible to parse a JSON array into a tuple struct with a vector of enums?

use serde::Deserialize;

#[derive(Deserialize, Debug, PartialEq, Eq)]
enum Data {
    Single(i32),
    List(Vec<Data>),
}

#[derive(Deserialize, Debug, PartialEq, Eq)]
struct Packet(Vec<Data>);

fn main() {
    let packet = r#"[1, [2], [[3]]]"#;

    assert_eq!(
        (serde_json::from_str::<Packet>(packet)).unwrap(),
        Packet(vec![
            Data::Single(1),
            Data::List(vec![Data::Single(2)]),
            Data::List(vec![Data::List(vec![Data::Single(3)])])
        ])
    );
}

The above does not work, as an enum value has to be an object with a proper key. An example of valid input is "[{"Single": 1},{"List": [{"Single": 2}]}]".

Paweł Rubin
  • 2,030
  • 1
  • 14
  • 25

1 Answers1

1

You're looking for "untagged enums":

#[derive(Deserialize, Debug, PartialEq, Eq)]
#[serde(untagged)]
enum Data {
    Single(i32),
    List(Vec<Data>),
}
PitaJ
  • 12,969
  • 6
  • 36
  • 55