#[macro_use] 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)] enum TestEnum { #[serde(rename = "A")] TypeA, #[serde(rename = "B")] TypeB, } #[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); let data = r#" { "name": "John Doe", "age": 43, "phones": [ "+44 1234567", "+44 2345678" ] }"#; let v: Value = serde_json::from_str(data)?; println!("{}", v); let mut john = json!({ "name": "John Doe", "age": 43, "phones": [ "+44 1234567", "+44 2345678" ] }); println!("{}", &john); if let Option::Some(ref mut m) = john.as_object_mut() { m.insert("test".into(), Value::Bool(true)); m.insert("test2".into(), Value::String("hello world".into())); } println!("{}", john); Ok(()) }