36

在 play 2.1 中,读取用于将 Json 编组到对象。但是当案例类只有一个字段时,我该怎么做。适用于更多领域的理念不起作用,因为没有使用一个领域“和”。因此我没有得到 FunctionBuilder。

以下代码给了我一个类型不匹配。我怎样才能解决这个问题?

case class Data(stamm: Seq[String])


implicit val dataReads  = (
  (__ \ "stamm").read(Reads.list[String])
)(Data)
4

4 回答 4

48

正如 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._
于 2014-06-26T16:52:12.373 回答
30

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
于 2013-02-07T16:59:15.197 回答
8

根据@yokomizor 的回答,我找到了最简单的解决方案来创建Formatter一个

case class Person(name: String)
val personFormatter: Format[Person] =
  (__ \ "full_name").format[String].inmap(Person.apply, unlift(Person.unapply))
于 2015-05-08T14:05:20.347 回答
1

比公认的更简单的解决方案:

case class A(value: String)
val reads = (__ \ "key").read[String].map(A.apply)
于 2016-05-01T00:28:04.973 回答