1 个不稳定版本
0.1.0 | 2019年9月15日 |
---|
#1350 in 编码
每月40次下载
9KB
110 行
serde-mappable-seq
一个非官方的第三方 crate,可以将键控结构体的序列反序列化到 HashMap 或 BTreeMap,反之亦然。
有时 API 会提供一个包含资源实例的序列列表,例如用户列表。想象一下这个 JSON 有效载荷
{
"data": {
"users": [
{
"id": 1,
"name": "foo"
}
]
},
"links": {}
}
如果你想通过 ID 获取某个东西,你可能需要手动后处理(有点烦人)或者循环查找具有该 ID 的用户(有点昂贵)。
serde-mappable-seq
使得将资源序列转换为键控映射变得简单。
安装
此库需要至少 Rust 1.31.0。
将其添加到您的 Cargo.toml
[dependencies]
serde-mappable-seq = "0.1"
示例
将包含 2 个用户序列的结构体反序列化到 HashMap,键为它们的 ID
use serde_derive::{Deserialize, Serialize};
use serde_mappable_seq::Key;
use std::collections::HashMap;
#[derive(Deserialize, Serialize)]
struct User {
id: u64,
name: String,
}
impl Key<'_, u64> for User {
fn key(&self) -> u64 {
self.id
}
}
#[derive(Deserialize, Serialize)]
struct Response {
#[serde(with = "serde_mappable_seq")]
users: HashMap<u64, User>,
}
# fn main() -> Result<(), Box<dyn std::error::Error>> {
let input = r#"{
"users": [
{
"id": 1,
"name": "foo"
}
]
}"#;
let response = serde_json::from_str::<Response>(input)?;
assert_eq!("foo", response.users.get(&1).unwrap().name);
// Now serialize it back and make sure it's the same as the original input.
assert_eq!(input, serde_json::to_string_pretty(&response)?);
# Ok(()) }
将上述示例中的响应结构体实例序列化将返回原始输入。
许可证
ISC。
依赖项
~110–345KB