如果case类只有一个字段,如何将json转换为case类

neb*_*mir 34 json scala playframework-2.1

在游戏中2.1读取用于将Json编组为对象.但是当case类只有一个字段时,我怎么能这样做呢.适用于更多字段的ideom不起作用,因为没有使用一个字段'和'.因此我没有得到FunctionBuilder.

以下代码给出了类型不匹配的信息.我怎样才能解决这个问题?

case class Data(stamm: Seq[String])


implicit val dataReads  = (
  (__ \ "stamm").read(Reads.list[String])
)(Data)
Run Code Online (Sandbox Code Playgroud)

yok*_*zor 46

正如Julien回答的那样,您可以使用以下方法读取单字段案例类:

case class Person(name: String)

val personReads: Reads[Person] = 
  (__ \ "name").read[String].map { name => Person(name) }
Run Code Online (Sandbox Code Playgroud)

只是一个补充,如果你想写:

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

或格式化(读写):

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

对于写入和格式,您必须导入:

import play.api.libs.functional.syntax._
Run Code Online (Sandbox Code Playgroud)

  • 谢啦!你节省了很多时间.但问题是人们如何设计图书馆 - 为什么这个简单的事情不能使用与许多领域相同的方法%) (2认同)

Jul*_*ont 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
Run Code Online (Sandbox Code Playgroud)


Zol*_*tán 8

根据@ yokomizor的答案,我发现最简单的解决方案来创建一个Formatter

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