2

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");
  • 6
    If this is from the "indexmap" crate, there is a ["serde" feature flag](https://docs.rs/crate/indexmap/latest/features) that probably enables this functionality. – kmdreko Jul 10 '22 at 20:26

1 Answers1

5

To deserialize index map you need either feature flag serde or serde-1.

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 = "1.9.1", features = ["serde-1"]}
AlexN
  • 1,613
  • 8
  • 21