在 Hashmap 中使用枚举作为键时无法序列化

Cant serialize when using enum as key in Hashmap

use serde::{Deserialize, Serialize};

#[derive(Debug, PartialEq, Serialize, Deserialize)]
pub struct Demo {
    #[serde(with = "serde_with::json::nested")]
    pub something: HashMap<Option<Resource>, bool>,
}

#[derive(Debug, PartialEq, Serialize, Deserialize, Eq, Hash)]
pub enum Resource {
    #[serde(rename = "cpu")]
    Cpu,
    #[serde(rename = "memory")]
    Memory,
}

我正在使用枚举 属性“资源”作为我的哈希映射键。 现在,我想将我的数据发送到 HTTP 端点,所以我想序列化数据。 我就是这样做的:

let mut something = HashMap::new();
something.insert(Some(Cpu), true);

let data = Demo{
    something: something,
};


let serialized = serde_json::to_string(&data).unwrap();
println!("serialized {}", serialized);

但是,to_string 没有说 ==> Error("key must be a string", line: 0, column: 0)

我可以在序列化时将枚举值映射为字符串吗?如何解决这个问题?

您可以使用 serde_with 中的不同注释来使您的示例正常工作。你如何使用 serde_with::json::nested 的问题在于它将整个 HashMap 转换为 String,但失败了,因为键没有序列化为字符串。如果仅将属性应用于关键部分,它会起作用。

#[serde_with::serde_as]
#[derive(Debug, PartialEq, Serialize, Deserialize)]
pub struct Demo {
    #[serde_as(as = "HashMap<serde_with::json::JsonString, _>")]
    pub something: HashMap<Option<Resource>, bool>,
}