How to turn json to case class when case class has only one field How to turn json to case class when case class has only one field json json

How to turn json to case class when case class has only one field


As Julien answered, you can read single field case classes using this:

case class Person(name: String)val personReads: Reads[Person] =   (__ \ "name").read[String].map { name => Person(name) }

Just a complement, if you want to write:

val personWrites: Writes[Person] =   (__ \ "name").write[String].contramap { (person: Person) => person.name }

Or format (read and write):

val personFormat: Format[Person] =   (__ \ "name").format[String].inmap(name => Person(name), (person: Person) => person.name)

For write and format you have to import this:

import play.api.libs.functional.syntax._


Json combinators doesn't work for single field case class.

Pascal (writer of this API) has explained this situation herehttps://groups.google.com/forum/?fromgroups=#!starred/play-framework/hGrveOkbJ6U

There are some workarounds which works, like this one:

case class A(value: List[Int])val areads = (__ \ 'value).read[List[Int]].map{ l => A(l) } // covariant map


Based on @yokomizor's answer, I found the simplest solution to create a Formatter to be

case class Person(name: String)val personFormatter: Format[Person] =  (__ \ "full_name").format[String].inmap(Person.apply, unlift(Person.unapply))