Play JSON Reads/Writes with single-parameter case classes Play JSON Reads/Writes with single-parameter case classes json json

Play JSON Reads/Writes with single-parameter case classes


Like Travis said:

  1. Transforming an existing Reads: use the map method
  2. Transforming an existing Writes: use contramap

However, contramap only works on Writes that produce JsObject. Your writes will fail at runtime:

val w = JsPath.write[String].contramap[B](_.a)scala> w.writes(B("Hello"))java.lang.RuntimeException: when empty JsPath, expecting JsObject

You can create a Writes "from scratch" using Writes.apply:

Writes[B](b => JsString(b.a))

Similarly you can create a Reads using Reads.apply.


implicit val reads: Reads[A] = (JsPath \ "ax").read[B].map(A.apply)