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

如何在Serde中对强类型JSON字典进行(反)序列化?

解决Rust中处理字符串键+自定义结构体值的JSON字典问题

嘿,这事儿其实超简单!你要的就是一个以字符串为键、DictionaryValue为值的哈希映射,Rust标准库的HashMap配合serde完全能搞定,而且和你现有的代码无缝兼容。

步骤1:确保依赖配置正确

首先检查你的Cargo.toml,要包含serde和serde_json,并且开启serde的derive特性:

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

步骤2:定义结构并使用HashMap

你已经有了DictionaryValue结构体,现在只需要用HashMap<String, DictionaryValue>来表示你要的字典结构。如果觉得这个类型写起来太长,还可以定义一个类型别名简化:

use serde_derive::{Serialize, Deserialize};
use serde_json::Number;
use std::collections::HashMap;

#[derive(Serialize, Deserialize, Debug, PartialEq)]
struct DictionaryValue {
    data: Number,
}

// 可选:定义类型别名让代码更简洁
type MyJsonDictionary = HashMap<String, DictionaryValue>;

步骤3:序列化与反序列化示例

下面是完整的使用示例,包含创建字典、序列化为JSON字符串,再反序列化回来验证数据:

fn main() -> Result<(), serde_json::Error> {
    // 构建你要的字典结构
    let mut dict = MyJsonDictionary::new();
    dict.insert(
        "foo".to_string(),
        DictionaryValue { data: Number::from(42) }
    );
    dict.insert(
        "bar".to_string(),
        DictionaryValue { data: Number::from(1337) }
    );

    // 序列化为格式化后的JSON字符串
    let json_output = serde_json::to_string_pretty(&dict)?;
    println!("生成的JSON:\n{}", json_output);

    // 把JSON字符串反序列化回HashMap
    let parsed_dict: MyJsonDictionary = serde_json::from_str(&json_output)?;

    // 验证数据是否正确
    assert_eq!(parsed_dict["foo"].data, Number::from(42));
    assert_eq!(parsed_dict["bar"].data, Number::from(1337));

    Ok(())
}

为什么这能行?

serde对标准库的HashMap有内置的序列化/反序列化支持,只要你的键(这里是String)和值(这里是DictionaryValue)都实现了Serialize和Deserialize trait——而你已经通过#[derive(Serialize, Deserialize)]给DictionaryValue加上了这些特性,String本身也天然支持,所以完全不用额外写任何适配代码。

运行这个程序,你会得到和你示例里一模一样的JSON输出,反序列化也能完美还原数据。

内容的提问来源于stack exchange,提问作者Filippo Costa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:56:48