在游戏中2.1读取用于将Json编组为对象。但是当case类只有一个字段时,我怎么能这样做呢。适用于更多字段的ideom不起作用,因为没有使用一个字段'和'。因此我没有得到FunctionBuilder。
以下代码给出了类型不匹配的信息。我该如何解决这个问题?
case class Data(stamm: Seq[String])
implicit val dataReads = (
(__ \ "stamm").read(Reads.list[String])
)(Data)
答案 0 :(得分:45)
正如Julien回答的那样,您可以使用以下方法阅读单字段案例类:
case class Person(name: String)
val personReads: Reads[Person] =
(__ \ "name").read[String].map { name => Person(name) }
如果你想写,只是补充:
val personWrites: Writes[Person] =
(__ \ "name").write[String].contramap { (person: Person) => person.name }
或格式化(读写):
val personFormat: Format[Person] =
(__ \ "name").format[String].inmap(name => Person(name), (person: Person) => person.name)
对于写入和格式,您必须导入:
import play.api.libs.functional.syntax._
答案 1 :(得分:29)
Json组合器不适用于单字段案例类。
Pascal(这个API的作者)在这里解释了这种情况 https://groups.google.com/forum/?fromgroups=#!starred/play-framework/hGrveOkbJ6U
有一些解决方法可行,如下所示:
case class A(value: List[Int])
val areads = (__ \ 'value).read[List[Int]].map{ l => A(l) } // covariant map
答案 2 :(得分:8)
基于@ yokomizor的回答,我找到了创建Formatter
的最简单的解决方案
case class Person(name: String)
val personFormatter: Format[Person] =
(__ \ "full_name").format[String].inmap(Person.apply, unlift(Person.unapply))
答案 3 :(得分:1)
比公认的解决方案更简单:
case class A(value: String)
val reads = (__ \ "key").read[String].map(A.apply)