Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

In play 2.1 reads are used to marshall Json to objects. But how can I do this when the case class has only one field. The ideom that works for more fields does not work, as with one field 'and' is not used. Thus I do not get a FunctionBuilder.

The following code gives me a type mismatch. How can I fix this?

case class Data(stamm: Seq[String])   implicit val dataReads  = (   (__ \ "stamm").read(Reads.list[String]) )(Data) 
like image 841
nebenmir Avatar asked Feb 07 '13 14:02

nebenmir


1 Answers

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._ 
like image 177
yokomizor Avatar answered Sep 19 '22 23:09

yokomizor