在Play Framework中使用Reads [T]验证Json

时间:2014-01-17 15:50:32

标签: json scala playframework

查看一个简单的Scala Play JSON示例(来自Play docs)以针对JsValue验证JSON(类型case class):

import play.api.libs.json._
import play.api.libs.functional.syntax._
import play.api.data.validation.ValidationError

scala> implicit val creatureReads: Reads[Creature] = (
     |  (__ \ "name").read[String] and
     |  (__ \ "isDead").read[Boolean])
<console>:17: error: type mismatch;
 found   : play.api.libs.functional.FunctionalBuilder[play.api.libs.json.Reads]
#CanBuild2[String,Boolean]
 required: play.api.libs.json.Reads[Creature]
        (__ \ "name").read[String] and
                                   ^

然后,最终称之为:

scala> val creature = Json.obj(  "name" -> "zombie", "isDead" -> true )
creature: play.api.libs.json.JsObject = {"name":"zombie","isDead":true}

scala> creature.validate[Creature]
...

但是,我怎样才能解决type mismatch我看到的问题?

1 个答案:

答案 0 :(得分:3)

您几乎就在那里 - 您需要做的就是将CanBuild2应用于Creature构造函数:

implicit val creatureReads: Reads[Creature] = (
  (__ \ "name").read[String] and (__ \ "isDead").read[Boolean]
)(Creature)

一切都会按预期工作。这种语法有点复杂,但您可以将其视为“提升”构造函数到Reads的应用程序仿函数,它允许您将它应用于字段的两个Reads值。 My answer here是指Scalaz的应用构建器语法而不是Play的,但它们基本相同 - 只需将|@|读为and

  

奇怪的一部分是xs |@| ys并不是真正的意思   任何事物本身 - 它本质上是一个等待的参数列表   适用于它将升入其应用程序的功能   仿函数并适用于自己。

另请参阅我的回答here和博文here以进行其他讨论。