繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM