diff --git a/apollo-router-core/src/request.rs b/apollo-router-core/src/request.rs index 0868afe1c4..5778794ed5 100644 --- a/apollo-router-core/src/request.rs +++ b/apollo-router-core/src/request.rs @@ -20,7 +20,11 @@ pub struct Request { pub operation_name: Option, /// The optional variables in the form of a json object. - #[serde(skip_serializing_if = "Object::is_empty", default)] + #[serde( + skip_serializing_if = "Object::is_empty", + default, + deserialize_with = "deserialize_null_default" + )] #[builder(default)] pub variables: Arc, @@ -30,6 +34,16 @@ pub struct Request { pub extensions: Object, } +// NOTE: this deserialize helper is used to transform `null` to Default::default() +fn deserialize_null_default<'de, D, T: Default + Deserialize<'de>>( + deserializer: D, +) -> Result +where + D: serde::Deserializer<'de>, +{ + >::deserialize(deserializer).map(|x| x.unwrap_or_default()) +} + #[cfg(test)] mod tests { use super::*;