【发布时间】:2020-07-19 07:30:52
【问题描述】:
此示例代码:
use std::collections::BTreeMap;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, PartialOrd, Ord)]
struct Foo {
bar: String,
baz: Baz
}
#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq, PartialOrd, Ord)]
enum Baz {
Quux(u32),
Flob,
}
#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq, PartialOrd, Ord)]
struct Bish {
bash: u16,
bosh: i8
}
fn main() -> std::io::Result<()> {
let mut btree: BTreeMap<Foo, Bish> = BTreeMap::new();
let foo = Foo {
bar: "thud".to_string(),
baz: Baz::Flob
};
let bish = Bish {
bash: 1,
bosh: 2
};
println!("foo: {}", serde_json::to_string(&foo)?);
println!("bish: {}", serde_json::to_string(&bish)?);
btree.insert(foo, bish);
println!("btree: {}", serde_json::to_string(&btree)?);
Ok(())
}
给出运行时输出/错误:
foo: {"bar":"thud","baz":"Flob"}
bish: {"bash":1,"bosh":2}
Error: Custom { kind: InvalidData, error: Error("key must be a string", line: 0, column: 0) }
我用谷歌搜索了这个,发现问题在于序列化程序会尝试写入:
{{"bar":"thud","baz":"Flob"}:{"bash":1,"bosh":2}}}
这不是有效的 JSON,因为键必须是字符串。
互联网告诉我编写自定义序列化程序。
这不是一个实际的选择,因为我有大量不同的非字符串键。
如何使 serde_json 序列化(和反序列化):
{"{\"bar\":\"thud\",\"baz\":\"Flob\"}":{"bash":1,"bosh":2}}
对于 BTreeMap 和 HashMap 中的任意非字符串键?
【问题讨论】:
标签: rust hashmap serde btreemap