#serde-json #json-key #key-string #iterator #key #hash-map #struct

serde_json_any_key

用于解决与 serde_json 相关的 "键必须是字符串" 错误。将任何 HashMap、Vec、Iter<(&K,&V)>> 或 Iter<&(K,V)>> 反序列化为 JSON 字典。

4 个稳定版本

2.0.0 2022 年 6 月 13 日
1.1.0 2022 年 6 月 3 日
1.0.1 2022 年 6 月 2 日

#590编码

Download history 2743/week @ 2024-03-14 2255/week @ 2024-03-21 1078/week @ 2024-03-28 2112/week @ 2024-04-04 1828/week @ 2024-04-11 2989/week @ 2024-04-18 2663/week @ 2024-04-25 2712/week @ 2024-05-02 5067/week @ 2024-05-09 2413/week @ 2024-05-16 3044/week @ 2024-05-23 1562/week @ 2024-05-30 2759/week @ 2024-06-06 2653/week @ 2024-06-13 3090/week @ 2024-06-20 2298/week @ 2024-06-27

每月 10,957 次下载
用于 ratrod-rs

无许可

49KB
765

serde_json_any_key

在 docs.rs 上查看文档

用于解决与 serde_json 相关的 "键必须是字符串" 错误。将任何 HashMap、Vec<(K,V)>>、Iter<(&K,&V)>> 或 Iter<&(K,V)>> 反序列化为 JSON 字典。

输出将与您手动将 K 序列化为 String 时相同。如果 K 已经是 String,它将表现得与 serde_json 相同。

对于实现 IntoIterator>、IntoIterator对于实现 FromIterator<(K,V)>> 的任何类型,都实现了反序列化。

通过以下属性支持嵌套字典的 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