4 个稳定版本
2.0.0 | 2022 年 6 月 13 日 |
---|---|
1.1.0 | 2022 年 6 月 3 日 |
1.0.1 | 2022 年 6 月 2 日 |
#590 在 编码
每月 10,957 次下载
用于 ratrod-rs
49KB
765 行
serde_json_any_key
在 docs.rs 上查看文档
用于解决与 serde_json 相关的 "键必须是字符串" 错误。将任何 HashMap
输出将与您手动将 K 序列化为 String 时相同。如果 K 已经是 String,它将表现得与 serde_json 相同。
对于实现 IntoIterator
通过以下属性支持嵌套字典的 struct 的反/序列化
#[serde(with = "any_key_vec")]
#[serde(with = "any_key_map")]
该包完全使用安全、稳定的 Rust 实现。
示例
use std::collections::HashMap;
use serde::{Serialize, Deserialize};
use serde_json_any_key::*;
#[derive(Clone, Copy, Deserialize, Serialize, PartialEq, Eq, Hash, Debug)]
pub struct Test {
pub a: i32,
pub b: i32
}
fn main() {
// Create a map with a struct key
let mut map = HashMap::<Test, Test>::new();
map.insert(Test {a: 3, b: 5}, Test {a: 7, b: 9});
// Regular serde_json cannot serialize this map
let fail = serde_json::to_string(&map);
assert_eq!(fail.err().unwrap().to_string(), "key must be a string");
// Use this crate's utility function
// Outputs {"{\"a\":3,\"b\":5}":{"a":7,"b":9}}
let ser1 = map.to_json_map().unwrap();
assert_eq!(ser1, r#"{"{\"a\":3,\"b\":5}":{"a":7,"b":9}}"#);
// You can also serialize a Vec or slice of tuples to a JSON map
let mut vec = Vec::<(Test, Test)>::new();
vec.push((Test {a: 3, b: 5}, Test {a: 7, b: 9}));
let ser2 = vec.to_json_map().unwrap();
// Output is identical in either case
assert_eq!(ser1, ser2);
// And can be deserialized to either type
let deser_map: HashMap<Test, Test> = json_to_map(&ser2).unwrap();
let deser_vec: Vec<(Test, Test)> = json_to_vec(&ser1).unwrap();
assert_eq!(map, deser_map);
assert_eq!(vec, deser_vec);
// De/serialization of structs with nested maps is supported via the following attributes:
// #[serde(with = "any_key_vec")]
// #[serde(with = "any_key_map")]
// Both the "map" and "vec" fields will serialize identically - as a JSON map
#[derive(Clone, Deserialize, Serialize, PartialEq, Eq, Debug)]
pub struct NestedTest {
#[serde(with = "any_key_map")]
map: HashMap<Test, Test>,
#[serde(with = "any_key_vec")]
vec: Vec<(Test, Test)>
}
let nested = NestedTest {
map: map,
vec: vec,
};
// You can use the usual serde_json functions now
let ser_nested = serde_json::to_string(&nested).unwrap();
let deser_nested: NestedTest = serde_json::from_str(&ser_nested).unwrap();
assert_eq!(nested, deser_nested);
}
依赖项
~0.6–1.4MB
~31K SLoC