#sequence #user #serialization #deserialize #third-party #hash-map #serde

serde-mappable-seq

非官方的 serde (de)serializers 用于可映射序列

1 个不稳定版本

0.1.0 2019年9月15日

#1350 in 编码

每月40次下载

ISC 许可证

9KB
110

license-badge docs-badge rust badge

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