serde_json解析JSON至IndexMap提示Deserialize未实现的解决方法
可行方案
IndexMap本身原生支持serde序列化/反序列化,编译报错是因为依赖默认没有开启serde相关的功能开关,不需要手写自定义反序列化逻辑,按以下步骤调整即可:
- 第一步:修改
Cargo.toml中的indexmap依赖配置,开启serdefeature:
[dependencies] # 版本号可根据实际需求调整,核心是加上features = ["serde"] indexmap = { version = "2.2", features = ["serde"] } serde_json = "1.0"
开启该feature后,indexmap会自动为IndexMap实现serde::Deserialize和serde::Serialize trait,反序列化时会自动保留JSON对象键值对的原始顺序,完全匹配使用需求。
- 第二步:原有解析逻辑不需要修改,补充对应引用即可正常编译运行,完整可运行示例如下:
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"); // 遍历即可看到元素顺序和JSON中定义的顺序完全一致 for (element_name, mass_num) in elements { println!("{element_name}: {mass_num}"); } }
兼容方案:如果受项目依赖版本限制无法开启
indexmap的serdefeature,可以先将JSON解析为serde_json::Value,取出其中的Object类型后按迭代顺序逐个插入IndexMap,但该方案需要额外做一次数据转换,性能略低于直接开启feature的方案,非必要不推荐。
内容的提问来源于stack exchange,提问作者absolute failure
相关产品推荐
相关产品推荐

