rustserde-json

Using IndexMap with serde_json


I would like to use serde_json to parse a .json file into a IndexMap. However it says the Deserialize trait has not been implemented for IndexMap. Is there a way to use serde_json with IndexMap?

let elements: IndexMap<String, Value> = serde_json::from_str(r#"
        {
            "Hydrogen       (H) ": 1,
            "Helium         (He)": 4,
            "Lithium        (Li)": 7,
            "Beryllium      (Be)": 9,
            "Boron          (B) ": 11,
            "Carbon         (C) ": 12,
            "Nitrogen       (N) ": 14,
            "Oxygen         (O) ": 16,
            "Flourine       (F) ": 19,
            "Neon           (Ne)": 20
        }
    "#).expect("err: unable to parse json");

Solution

  • To deserialize index map you need the feature flag serde.

    main.rs

    use indexmap::IndexMap;
    use serde_json::Value;
    
    fn main() {
        let elements: IndexMap<String, Value> = serde_json::from_str(r#"
            {
                "Hydrogen       (H) ": 1,
                "Helium         (He)": 4,
                "Lithium        (Li)": 7,
                "Beryllium      (Be)": 9,
                "Boron          (B) ": 11,
                "Carbon         (C) ": 12,
                "Nitrogen       (N) ": 14,
                "Oxygen         (O) ": 16,
                "Flourine       (F) ": 19,
                "Neon           (Ne)": 20
            }
        "#).expect("err: unable to parse json");
        eprintln!("{:?}", elements);
    }
    

    Cargo.toml

    [dependencies]
    serde = { version = "1.0", features = ["derive"] }
    serde_json = "1.0"
    indexmap = { version = "2.9.0", features = ["serde"] }