gpt4 book ai didi

rust - 使用 serde 序列化时如何对 HashMap 键进行排序?

转载 作者:行者123 更新时间:2023-11-29 07:43:17 25 4
gpt4 key购买 nike

我正在使用 serde 序列化一个 HashMap,如下所示:

#[derive(Serialize, Deserialize)]
struct MyStruct {
map: HashMap<String, String>
}

HashMap 的键顺序是未指定的,并且由于散列是随机的(参见 documentation ),键实际上最终会在相同的运行之间以不同的顺序出现。

我希望我的 HashMap 以排序的(例如字母顺序)键顺序进行序列化,以便序列化是确定的。

我可以使用 BTreeMap而不是 HashMap 来实现这一点,如 BTreeMap::keys()按排序顺序返回其键,但我宁愿不更改我的数据结构来适应序列化逻辑。

如何告诉 serde 在序列化之前对 HashMap 键进行排序?

最佳答案

使用 serialize_with field attribute :

use serde::{Deserialize, Serialize, Serializer}; // 1.0.106
use serde_json; // 1.0.52
use std::collections::{BTreeMap, HashMap};

#[derive(Serialize, Deserialize, Default)]
struct MyStruct {
#[serde(serialize_with = "ordered_map")]
map: HashMap<String, String>,
}

fn ordered_map<S>(value: &HashMap<String, String>, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
let ordered: BTreeMap<_, _> = value.iter().collect();
ordered.serialize(serializer)
}

fn main() {
let mut m = MyStruct::default();
m.map.insert("gamma".into(), "3".into());
m.map.insert("alpha".into(), "1".into());
m.map.insert("beta".into(), "2".into());

println!("{}", serde_json::to_string_pretty(&m).unwrap());
}

在这里,我选择从 HashMap 重建整个 BTreeMap,然后重用现有的序列化实现。

{
"map": {
"alpha": "1",
"beta": "2",
"gamma": "3"
}
}

关于rust - 使用 serde 序列化时如何对 HashMap 键进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42723065/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com