Skip to content

Instantly share code, notes, and snippets.

@rust-play
Created October 31, 2018 21:25
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save rust-play/c17594ef6200065794091f71f86fe57e to your computer and use it in GitHub Desktop.
Save rust-play/c17594ef6200065794091f71f86fe57e to your computer and use it in GitHub Desktop.
Code shared from the Rust Playground
extern crate serde;
#[macro_use]
extern crate serde_derive; // 1.0.80
extern crate serde_json;
extern crate chrono; // 0.4.6
use std::collections::BTreeMap;
use std::fmt::Display;
use chrono::{DateTime,Utc};
use std::str::FromStr;
use serde::de::{Deserialize, Deserializer};
#[serde(deny_unknown_fields)]
#[derive(Deserialize, Debug)]
struct Container {
#[serde(deserialize_with="from_str")]
creation: DateTime<Utc>,
#[serde(deserialize_with="from_str")]
items: BTreeMap<DateTime<Utc>, Item>
}
#[serde(deny_unknown_fields)]
#[derive(Deserialize, Debug)]
struct Item{
id: u8
}
fn from_str<'de, T, D>(deserializer: D) -> Result<T, D::Error>
where T: FromStr,
T::Err: Display,
D: Deserializer<'de>
{
let s = String::deserialize(deserializer)?;
T::from_str(&s).map_err(serde::de::Error::custom)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test() {
let data = r#"
{ "creation": "2018-05-20".
"items": {
"2018-10-19": {
"id": 10
},
"2018-10-20": {
"id": 20
}
}
}
"#;
let v = serde_json::from_str::<Container>(data);
println!("Test");
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment