我正在HashMap用serde 序列化,就像这样:
#[derive(Serialize, Deserialize)]
struct MyStruct {
map: HashMap<String, String>
}
Run Code Online (Sandbox Code Playgroud)
HashMap密钥的顺序是未指定的,并且由于散列是随机的(参见文档),因此密钥实际上最终会在相同的运行之间以不同的顺序出现.
我希望我HashMap按照排序(例如字母)键顺序进行序列化,以便序列化是确定性的.
我可以使用a BTreeMap而不是a HashMap来实现这一点,因为BTreeMap::keys()它按排序顺序返回它的键,但我宁愿不改变我的数据结构只是为了适应序列化逻辑.
如何HashMap在序列化之前告诉serde对键进行排序?
She*_*ter 11
extern crate serde;
#[macro_use]
extern crate serde_derive;
extern crate serde_json;
use serde::{Serialize, Serializer};
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());
}
Run Code Online (Sandbox Code Playgroud)
在这里,我选择重建一个完整BTreeMap的HashMap,然后重用现有的序列化实现.
{
"map": {
"alpha": "1",
"beta": "2",
"gamma": "3"
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2342 次 |
| 最近记录: |