在 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>,
}
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>,
}