You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

serde_json解析JSON至IndexMap提示Deserialize未实现的解决方法

可行方案

IndexMap本身原生支持serde序列化/反序列化,编译报错是因为依赖默认没有开启serde相关的功能开关,不需要手写自定义反序列化逻辑,按以下步骤调整即可:

  • 第一步:修改Cargo.toml中的indexmap依赖配置,开启serde feature:
[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的serde feature,可以先将JSON解析为serde_json::Value,取出其中的Object类型后按迭代顺序逐个插入IndexMap,但该方案需要额外做一次数据转换,性能略低于直接开启feature的方案,非必要不推荐。

内容的提问来源于stack exchange,提问作者absolute failure

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 03:09:18