use std::fmt; use std::marker::PhantomData; use serde::Deserializer; use serde::Deserialize; #[derive(Deserialize, Debug)] #[serde(transparent)] struct Outer { #[serde(deserialize_with = "deserialize_vec")] data: Vec, } fn deserialize_vec<'de, D, T>(deserializer: D) -> Result, D::Error> where D: Deserializer<'de>, T: Deserialize<'de> + Default, { use serde::de::{SeqAccess, Visitor}; struct SeqVisitor(PhantomData); impl<'de, T> Visitor<'de> for SeqVisitor where T: Deserialize<'de> + Default, { type Value = Vec; fn expecting(&self, fmt: &mut fmt::Formatter<'_>) -> Result<(), fmt::Error> { fmt.write_str("default vec") } fn visit_seq>(self, mut seq: A) -> Result { let mut vec = Vec::new(); while let Ok(Some(elem)) = seq.next_element::>() { let val = elem.unwrap_or_default(); vec.push(val); } Ok(vec) } } deserializer.deserialize_seq(SeqVisitor(PhantomData)) } #[test] fn test() { let ret = serde_json::from_str::( "[]").unwrap(); dbg!(ret.data); }