2014-01-17 120 views
1

针对case class寻找一个简单的Scala播放JSON示例(从Play docs)来验证JSON(类型JsValue):验证的Json与读取[T]在播放框架

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

回答

2

你几乎没有,所有你需要做的是运用你的CanBuild2Creature构造:

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

和预期的一样,一切都会正常工作。这个语法有点复杂,但是您可以将它看作是将构造函数“解除”为Reads的应用函数,它允许您将它应用于字段的两个Reads值。 My answer here指Scalaz的应用性建设者语法,而不是玩的,但他们基本上是相同的,只是读|@|and

古怪的

一部分是xs |@| ys并不是真正意义上的own- 什么它本质上是一个参数列表,它正在等待 应用于一个函数,它将提升到其应用函数 函数并应用于自身。

另请参阅我的回答here和博客文章here的其他讨论。

+0

刚刚阅读你的第一个链接的答案。清晰而翔实 - 谢谢。 –