@@ -170,6 +170,10 @@ impl Params {
170 serde_json::from_value(value)
170 serde_json::from_value(value)
171 .map_err(|err| Error::invalid_params(format!("Invalid params: {}.", err)))
171 .map_err(|err| Error::invalid_params(format!("Invalid params: {}.", err)))
174+ pub fn is_none(&self) -> bool {
175+ self == &Params::None
175impl From<Params> for Value {
179impl From<Params> for Value {
@@ -187,7 +191,7 @@ impl From<Params> for Value {
187pub struct MethodCall {
191pub struct MethodCall {
188 pub jsonrpc: Option<Version>,
192 pub jsonrpc: Option<Version>,
189 pub method: String,
193 pub method: String,
190− #[serde(default = "default_params")]
194+ #[serde(default = "default_params", skip_serializing_if = "Params::is_none")]
191 pub params: Params,
195 pub params: Params,
192 pub id: Id,
196 pub id: Id,
@@ -197,7 +201,7 @@ pub struct MethodCall {
197pub struct Notification {
201pub struct Notification {
198 pub jsonrpc: Option<Version>,
202 pub jsonrpc: Option<Version>,
199 pub method: String,
203 pub method: String,
200− #[serde(default = "default_params")]
204+ #[serde(default = "default_params", skip_serializing_if = "Params::is_none")]
201 pub params: Params,
205 pub params: Params,
@@ -334,6 +338,33 @@ fn notification_serialize() {
342+fn serialize_skip_none_params() {
345+ let m = MethodCall {
346+ jsonrpc: Some(Version::V2),
347+ method: "shutdown".to_owned(),
348+ params: Params::None,
352+ let serialized = serde_json::to_string(&m).unwrap();
355+ r#"{"jsonrpc":"2.0","method":"shutdown","id":1}"#
358+ let n = Notification {
359+ jsonrpc: Some(Version::V2),
360+ method: "exit".to_owned(),
361+ params: Params::None,
364+ let serialized = serde_json::to_string(&n).unwrap();
365+ assert_eq!(serialized, r#"{"jsonrpc":"2.0","method":"exit"}"#);
338fn success_output_deserialize() {
369fn success_output_deserialize() {
339 use serde_json;
370 use serde_json;