I would like to build a custom Serde deserializer to deserialize an array of array of values into a Vec<Child>
where I have already written a custom deserializer to parse an array of values into a Child
.
What would be the best way to do that?
Thanks in advance for the help 
As an illustration I'm trying to make something like this work
struct Parent {
#[serde(deserialize_with = "parse_child")]
field: Vec<Child>,
}
where the below already exists
fn parse_child<'de, D>(deserializer: D) -> Result<Child, D::Error>
where
D: Deserializer<'de>,
{
struct ChildParser;
impl<'de> Visitor<'de> for ChildParser
{
type Value = Child;
fn visit_seq<A: SeqAccess<'de>>(self, seq: A) -> Result<Self::Value, A::Error> {
// create a Child object
}
}
deserializer.deserialize_any(ChildParser{})
}
Sample input I deserialize
[[49, 11.75, 0], [42, 9, 1]]
With a workable example and link to a playground
One idea would be to add a customer deserializer for a Vec<Child>
directly but I was wondering whether a more elegant solution would exist?
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(Debug, Deserialize)]
struct Parent {
#[serde(deserialize_with = "parse_child")]
single: Child,
//#[serde(deserialize_with = "parse_child")]
//array: Vec<Child>,
}
#[derive(Default, Debug, Deserialize)]
struct Child {
a: u64,
b: f32,
c: usize,
}
fn parse_child<'de, D>(deserializer: D) -> Result<Child, D::Error>
where
D: Deserializer<'de>,
{
struct ChildParser;
impl<'de> Visitor<'de> for ChildParser
{
type Value = Child;
fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
formatter.write_str("[u64, f32, usize]")
}
fn visit_seq<A: SeqAccess<'de>>(self, mut seq: A) -> Result<Self::Value, A::Error> {
println!("In custom deserializer");
let mut child = Child { ..Default::default() };
let tmp = seq.next_element::<u64>()?;
if let Some(a) = tmp {
child.a = a;
};
let tmp = seq.next_element::<f32>()?;
if let Some(b) = tmp {
child.b = b;
};
let tmp = seq.next_element::<usize>()?;
if let Some(c) = tmp {
child.c = c;
};
Ok(child)
}
}
deserializer.deserialize_any(ChildParser{})
}
fn main() {
let child_data = r#"[49, 11.75, 0]"#;
let child : Child = serde_json::from_str(child_data).unwrap();
println!("Child = {:?}", &child);
let parent_data = r#"{"single": [49, 11.75, 0]}"#;
let parent : Parent = serde_json::from_str(parent_data).expect("to be able to deserialize it");
println!("Parent = {:?}", &parent);
}