Crates.io | serde-mappable-seq |
lib.rs | serde-mappable-seq |
version | 0.1.0 |
source | src |
created_at | 2019-09-15 23:24:25.958681 |
updated_at | 2019-09-15 23:24:25.958681 |
description | Unnoficial third-party serde (de)serializers for mappable sequences |
homepage | https://github.com/valley-cafe/serde-mappable-vec |
repository | |
max_upload_size | |
id | 164967 |
size | 8,491 |
An unofficial third-party crate to deserialize sequences of keyed structs into HashMaps or BTreeMaps and vice versa.
Sometimes APIs will provide a list of instances of a resource in a sequence, such as a list of users. Imagine this JSON payload:
{
"data": {
"users": [
{
"id": 1,
"name": "foo"
}
]
},
"links": {}
}
If you want to get something by ID, you're going to either need to post-process it manually (slightly annoying) or loop through to find the user with the ID (slightly costly).
serde-mappable-seq
makes turning a sequence of a resource into a keyed
map easy.
This library requires at least Rust 1.31.0.
Add this to your Cargo.toml
:
[dependencies]
serde-mappable-seq = "0.1"
Deserialize a struct containing a sequence of 2 users into a HashMap, keyed by their IDs:
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(()) }
Serializing the instance of the response struct in the above example will net back the original input.
ISC.