From 20afa757f499688b56cbd6b8571014b75d6d4dce Mon Sep 17 00:00:00 2001 From: Jakob Odersky Date: Thu, 2 Aug 2018 15:24:52 -0700 Subject: Treat value classes transparently --- shared/src/main/scala/DerivedFormats.scala | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) (limited to 'shared/src/main/scala/DerivedFormats.scala') diff --git a/shared/src/main/scala/DerivedFormats.scala b/shared/src/main/scala/DerivedFormats.scala index f6a3f7b..ed39f46 100644 --- a/shared/src/main/scala/DerivedFormats.scala +++ b/shared/src/main/scala/DerivedFormats.scala @@ -24,18 +24,24 @@ trait DerivedFormats { self: BasicFormats => 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.collect { - case param - if !param.option || param.dereference(value) != None || printNull => - extractFieldName(param.label) -> param.typeclass.write( - param.dereference(value) - ) + override def write(value: T): JsValue = + if (ctx.isValueClass) { + val param = ctx.parameters.head + param.typeclass.write(param.dereference(value)) + } else { + 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: _*) } - JsObject(fields: _*) - } override def read(value: JsValue): T = value match { + case js if ctx.isValueClass => + ctx.construct(param => param.typeclass.read(value)) case obj: JsObject => if (ctx.isObject) { ctx.rawConstruct(Seq.empty) -- cgit v1.2.3