[英]Validating Json with Reads[T] in Play Framework
查看一个简单的Scala Play JSON示例(来自Play 文档 ),以针对case class
验证JSON(类型JsValue
):
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
?
你几乎就在那里 - 你需要做的就是将你的CanBuild2
应用于Creature
构造函数:
implicit val creatureReads: Reads[Creature] = (
(__ \ "name").read[String] and (__ \ "isDead").read[Boolean]
)(Creature)
一切都会按预期工作。 这种语法有点复杂,但您可以将其视为“将”构造函数“提升”为Reads
的applicative functor,它允许您将其应用于字段的两个Reads
值。 我在这里的答案是指Scalaz的应用构建器语法而不是Play的,但它们基本相同 - 只需阅读|@|
作为and
:
奇怪的一部分是
xs |@| ys
xs |@| ys
本身并不代表任何东西 - 它本质上是一个参数列表,它等待应用于一个函数,它将被提升到它的应用函子并适用于它自己。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.