From 3c00a1ad8013c375a598dd88139dce174e9bf401 Mon Sep 17 00:00:00 2001 From: Jakob Odersky Date: Thu, 19 Apr 2018 15:46:48 -0700 Subject: Expose functionality to override parameter to field name mapping --- shared/src/main/scala/DerivedFormats.scala | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) (limited to 'shared/src/main') diff --git a/shared/src/main/scala/DerivedFormats.scala b/shared/src/main/scala/DerivedFormats.scala index eabfa82..4a0b8b4 100644 --- a/shared/src/main/scala/DerivedFormats.scala +++ b/shared/src/main/scala/DerivedFormats.scala @@ -9,11 +9,16 @@ import scala.language.experimental.macros trait DerivedFormats { self: BasicFormats => type Typeclass[T] = JsonFormat[T] + /** Convert the name of a parameter to that of a field in a JSON object. This + * method can be overriden to use alternative naming conventions. */ + def extractFieldName(paramName: String): String = paramName + 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 => - param.label -> param.typeclass.write(param.dereference(value)) + extractFieldName(param.label) -> param.typeclass.write( + param.dereference(value)) } JsObject(fields: _*) } @@ -24,10 +29,11 @@ trait DerivedFormats { self: BasicFormats => ctx.rawConstruct(Seq.empty) } else { ctx.construct { param => + val fieldName = extractFieldName(param.label) val fieldValue = if (param.option) { - obj.fields.getOrElse(param.label, JsNull) + obj.fields.getOrElse(fieldName, JsNull) } else { - obj.fields(param.label) + obj.fields(fieldName) } param.typeclass.read(fieldValue) } -- cgit v1.2.3