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

我只是一个虾纸丫 提交于 2019-11-26 12:22:06

问题


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)

回答1:


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

Pascal (writer of this API) has explained this situation here https://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



回答2:


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._



回答3:


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))



回答4:


Even simpler solution than the accepted one:

case class A(value: String)
val reads = (__ \ "key").read[String].map(A.apply)


来源:https://stackoverflow.com/questions/14754092/how-to-turn-json-to-case-class-when-case-class-has-only-one-field

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!