From c5c1aa6bc78b6ebc346befe9f4b434401a683a59 Mon Sep 17 00:00:00 2001 From: Jakob Odersky Date: Fri, 29 Jun 2018 17:56:06 -0700 Subject: Make inclusion of None values as null optional --- shared/src/main/scala/DerivedFormats.scala | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) (limited to 'shared/src/main') diff --git a/shared/src/main/scala/DerivedFormats.scala b/shared/src/main/scala/DerivedFormats.scala index 6ea7c4b..ccf48d1 100644 --- a/shared/src/main/scala/DerivedFormats.scala +++ b/shared/src/main/scala/DerivedFormats.scala @@ -13,13 +13,24 @@ trait DerivedFormats { self: BasicFormats => * method can be overriden to use alternative naming conventions. */ @inline def extractFieldName(paramName: String): String = paramName + /** Determines if `None` instances of options should be included in JSON output. + * + * By default, `None` values are ommitted entirely from resulting JSON + * objects. If overridden, they will be included as `null`s instead. + * + * Note that this has no effect in *reading* option types; undefined or null + * values are always converted to `None`. */ + def printNull: Boolean = false + def combine[T](ctx: CaseClass[JsonFormat, T]): JsonFormat[T] = new JsonFormat[T] { override def write(value: T): JsValue = { - val fields: Seq[(String, JsValue)] = ctx.parameters.map { param => - extractFieldName(param.label) -> param.typeclass.write( - param.dereference(value) - ) + val fields: Seq[(String, JsValue)] = ctx.parameters.collect { + case param + if !param.option || param.dereference(value) != None || printNull => + extractFieldName(param.label) -> param.typeclass.write( + param.dereference(value) + ) } JsObject(fields: _*) } -- cgit v1.2.3