serde
Serde is a framework for serializing and deserializing Rust data structures efficiently and generically.
仅依赖syn ,quote ,proc-macro2
基本操作
use serde::{Deserialize, Serialize}; // 主要是 Serialize,Deserialize 这两个宏 #[derive(Serialize, Deserialize, Debug)] struct Point { x: i32, y: i32, } fn main() { let point = Point { x: 1, y: 2 }; // Convert the Point to a JSON string. let serialized = serde_json::to_string(&point).unwrap(); // Prints serialized = {"x":1,"y":2} println!("serialized = {}", serialized); // Convert the JSON string back to a Point. let deserialized: Point = serde_json::from_str(&serialized).unwrap(); // Prints deserialized = Point { x: 1, y: 2 } println!("deserialized = {:?}", deserialized); }
Deserialize
#![allow(unused)] fn main() { // 以该结构为例子 #[derive(Serialize,Debug)] struct Duration{ secs:usize, nanos:usize, } // 方便反序列化 impl Duration { fn new(secs:usize,nanos:usize) -> Duration{ return Duration { secs:secs, nanos:nanos, } } } // 实现反序列化 impl<'de> Deserialize<'de> for Duration { fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> where D: Deserializer<'de>, { enum Field { Secs, Nanos } // This part could also be generated independently by: // // #[derive(Deserialize)] // #[serde(field_identifier, rename_all = "lowercase")] // enum Field { Secs, Nanos } // 给每个字段实现反序列化 impl<'de> Deserialize<'de> for Field { fn deserialize<D>(deserializer: D) -> Result<Field, D::Error> where D: Deserializer<'de>, { struct FieldVisitor; // visitor用于处理基本类型 impl<'de> Visitor<'de> for FieldVisitor { type Value = Field; fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { formatter.write_str("`secs` or `nanos`") } fn visit_str<E>(self, value: &str) -> Result<Field, E> where E: de::Error, { match value { "secs" => Ok(Field::Secs), "nanos" => Ok(Field::Nanos), _ => Err(de::Error::unknown_field(value, FIELDS)), } } } // 处理字段名 deserializer.deserialize_identifier(FieldVisitor) } } struct DurationVisitor; impl<'de> Visitor<'de> for DurationVisitor { type Value = Duration; fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { formatter.write_str("struct Duration") } // 针对序列 fn visit_seq<V>(self, mut seq: V) -> Result<Duration, V::Error> where V: SeqAccess<'de>, { let secs = seq.next_element()? .ok_or_else(|| de::Error::invalid_length(0, &self))?; let nanos = seq.next_element()? .ok_or_else(|| de::Error::invalid_length(1, &self))?; Ok(Duration::new(secs, nanos)) } // 常见的反序列化map fn visit_map<V>(self, mut map: V) -> Result<Duration, V::Error> where V: MapAccess<'de>, { let mut secs = None; let mut nanos = None; while let Some(key) = map.next_key()? { match key { Field::Secs => { if secs.is_some() { return Err(de::Error::duplicate_field("secs")); } secs = Some(map.next_value()?); } Field::Nanos => { if nanos.is_some() { return Err(de::Error::duplicate_field("nanos")); } nanos = Some(map.next_value()?); } } } let secs = secs.ok_or_else(|| de::Error::missing_field("secs"))?; let nanos = nanos.ok_or_else(|| de::Error::missing_field("nanos"))?; Ok(Duration::new(secs, nanos)) } } const FIELDS: &'static [&'static str] = &["secs", "nanos"]; deserializer.deserialize_struct("Duration", FIELDS, DurationVisitor) } } // 最后测试 let d = Duration{secs:123,nanos:345}; let ds = serde_json::to_string(&d).unwrap(); println!("{}",ds); let dd:Duration = serde_json::from_str(&ds).unwrap(); println!("{:#?}",dd); }