From 7dac91569668f6b840e191270167f005eb8d7b09 Mon Sep 17 00:00:00 2001 From: Hatter Jiang Date: Tue, 28 Jan 2020 17:08:15 +0800 Subject: [PATCH] add custom date --- serde-json-test/Cargo.toml | 1 + serde-json-test/src/main.rs | 21 +++++++++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/serde-json-test/Cargo.toml b/serde-json-test/Cargo.toml index 6acec42..9f33b2e 100644 --- a/serde-json-test/Cargo.toml +++ b/serde-json-test/Cargo.toml @@ -9,3 +9,4 @@ edition = "2018" [dependencies] serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" +chrono = "0.4.10" diff --git a/serde-json-test/src/main.rs b/serde-json-test/src/main.rs index af6bf5f..27e3ced 100644 --- a/serde-json-test/src/main.rs +++ b/serde-json-test/src/main.rs @@ -3,6 +3,24 @@ extern crate serde_json; use serde::{Deserialize, Serialize}; use serde_json::{Result, Value}; +use chrono::{DateTime, Utc, TimeZone}; + +mod my_date_format { + use chrono::{DateTime, Utc, TimeZone}; + use serde::{self, Deserialize, Serializer, Deserializer}; + + const FORMAT: &'static str = "%Y-%m-%d %H:%M:%S"; + + pub fn serialize(date: &DateTime, serializer: S ) -> Result where S: Serializer { + let s = format!("{}", date.format(FORMAT)); + serializer.serialize_str(&s) + } + + pub fn deserialize<'de, D>(deserializer: D ) -> Result, D::Error> where D: Deserializer<'de> { + let s = String::deserialize(deserializer)?; + Utc.datetime_from_str(&s, FORMAT).map_err(serde::de::Error::custom) + } +} // https://serde.rs/container-attrs.html #[derive(Clone, Copy, Debug, Serialize, Deserialize)] @@ -18,11 +36,14 @@ enum TestEnum { #[derive(Clone, Debug, Serialize, Deserialize)] struct TestStruct { ty: TestEnum, + #[serde(with = "my_date_format")] + timestamp: DateTime, } fn main() -> Result<()> { let serialized = serde_json::to_string(&TestStruct{ ty: TestEnum::TypeA, + timestamp: Utc.datetime_from_str("2020-01-28 17:04:00", "%Y-%m-%d %H:%M:%S").map_err(serde::de::Error::custom)?, })?; println!("{}", serialized);