簡體   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