通过使用自定义解串器,如下所示
extern crate serde_json; // 1.0.32
extern crate serde; // 1.0.80
#[macro_use] extern crate serde_derive;
use serde::de::{Deserializer, SeqAccess, Visitor};
use std::fmt;
#[derive(Serialize, Deserialize)]
struct Customer {
name: String,
#[serde(deserialize_with = "parse_property")]
properties: Property,
}
// #[derive(Default, Debug, Deserialize)]
#[derive(Default, Serialize, Deserialize, Debug)]
struct Property {
id: i32,
name: String,
}
#[derive(Default, Serialize, Deserialize, Debug)]
struct Key {
name: String,
value: i32,
}
#[derive(Default, Serialize, Deserialize, Debug)]
struct Val {
name: String,
value: String
}
fn parse_property<'de, D>(deserializer: D) -> Result<Property, D::Error>
where
D: Deserializer<'de>,
{
struct PropertyParser;
impl<'de> Visitor<'de> for PropertyParser
{
type Value = Property;
fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
formatter.write_str("expect [key, val]")
}
fn visit_seq<A: SeqAccess<'de>>(self, mut seq: A) -> Result<Self::Value, A::Error> {
println!("In custom deserializer");
let mut prop = Property { ..Default::default() };
let tmp = seq.next_element::<Key>()?;
if let Some(a) = tmp {
prop.id = a.value;
};
let tmp = seq.next_element::<Val>()?;
if let Some(b) = tmp {
prop.name = b.value;
};
Ok(prop)
}
}
deserializer.deserialize_any(PropertyParser{})
}
fn main() {
println!("Hello, world!");
let data = r#"
{
"name": "customer",
"properties": [
{
"name": "id",
"type": "int",
"value": 32
},
{
"name": "name",
"type": "string",
"value": "John"
}
]
}"#;
let p: Customer = serde_json::from_str(data).unwrap();
println!("Please call {} at the number {} {}", p.name, p.properties.id, p.properties.name);
}