aboutsummaryrefslogtreecommitdiff
path: root/shared/src/main
diff options
context:
space:
mode:
authorJakob Odersky <jakob@odersky.com>2018-08-02 15:24:52 -0700
committerJakob Odersky <jakob@odersky.com>2018-08-02 16:04:39 -0700
commit20afa757f499688b56cbd6b8571014b75d6d4dce (patch)
tree01d763e6db42e525eb71960519f5098170be9042 /shared/src/main
parenta511ec9662508f72f8ed63b08ccad41647fad9c5 (diff)
downloadspray-json-derivation-20afa757f499688b56cbd6b8571014b75d6d4dce.tar.gz
spray-json-derivation-20afa757f499688b56cbd6b8571014b75d6d4dce.tar.bz2
spray-json-derivation-20afa757f499688b56cbd6b8571014b75d6d4dce.zip
Treat value classes transparently
Diffstat (limited to 'shared/src/main')
-rw-r--r--shared/src/main/scala/DerivedFormats.scala24
1 files changed, 15 insertions, 9 deletions
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)