Parsing JSON with multiple representation in the same attribute Parsing JSON with multiple representation in the same attribute json json

Parsing JSON with multiple representation in the same attribute


I got help from the serde-rs developer:

I would recommend using an untagged enum to represent a coordinate array that can be 2d or 3d. Playground link

Here is the code after modification:

#[derive(Serialize, Deserialize, Debug)]struct Geometry {    #[serde(deserialize_with = "string_or_number", rename = "type")]    geometry_type: Value,    #[serde(default, skip_serializing_if = "Vec::is_empty", rename = "coordinates")]    geometry_coor: Vec<Coordinates_form>,}#[derive(Serialize, Deserialize, Debug)]#[serde(untagged)]enum Coordinates_form {    #[serde(skip_serializing)]    OneD(Coordinates),    #[serde(skip_serializing)]    TwoD(Vec<Coordinates>),    #[serde(skip_serializing)]    ThreeD(Vec<Vec<Coordinates>>),}#[derive(Deserialize, Debug)]struct Coordinates {    #[serde(deserialize_with = "string_or_number")]    longitude: Value,     #[serde(deserialize_with = "string_or_number")]    latitude: Value,}fn string_or_number<'de, D>(de: D) -> Result<Value, D::Error>where    D: serde::Deserializer<'de>,{    let helper: Value = Deserialize::deserialize(de)?;    match helper {        Value::Number(n) => {            println!("{:#?}", n.as_f64().unwrap().to_string());            Ok(Value::Number(n))        }        Value::String(s) => Ok(json!(s)),        _ => Ok(json!(null)),    }}