验证播放中的多个json值

时间:2014-03-10 20:10:10

标签: json scala playframework-2.0

我有来自请求的以下json字段

Action {
  request =>
    val jsValueOption = request.body.asJson
    jsValueOption.map {
      json =>
          val f1 = (json \ "f1").validate[String]
          val f2 = (json \ "f2").validate[String]
          val f3 = (json \ "f3").validate[String]
    ...

我需要确保所有这些字段都存在才能继续。否则,抛出BadRequest响应。这样做的正确方法是什么?我对这些get使用JsResult,然后使用try-catch或其他内容吗?

2 个答案:

答案 0 :(得分:2)

以下是我将如何处理它(基于2.3快照文档 - http://www.playframework.com/documentation/2.3-SNAPSHOT/ScalaJsonHttp)。与drstevens非常相似,但我在验证结果上使用了折叠来演示BadRequest / OK流程。值得注意的是,我使用的Reads模式会为所有字段提供累积的验证错误。

import play.api.mvc._
import play.api.libs.json._
import play.api.libs.functional.syntax._

case class MyRequest(f1: String, f2: String, f3: String)
implicit val myRequestReads: Reads[MyRequest] = (
  (JsPath \ "f1").read[String] and
  (JsPath \ "f2").read[String] and
  (JsPath \ "f3").read[String]
)(MyRequest.apply _)

def myAction = Action(BodyParsers.parse.json) { request =>
  val jsResult = request.body.validate[MyRequest]
  jsResult.fold(
    errors => {
      BadRequest(Json.obj("status" ->"KO", "message" -> JsError.toFlatJson(errors)))
    },
    myRequest => {
      println("Successful Request, f1 = " + myRequest.f1)
      Ok(Json.obj("status" ->"OK")
    }
  )
}

答案 1 :(得分:1)

为了理解部分答案被删除,因为正如@kipsigman指出的那样,map / flatMap JsResult的行为不像应用和累积失败。我也知道这一点。插入Tony Morris说,“告诉过你”。

我无论如何都不会直接访问这个身体,而是通过下面的宏来定义Reads / Format,或者通过像@kipsigman这样的应用组合来定义。{/ p>

case class MyRequest(f1: String, f2: String, f3: String)
object MyRequest { implicit val reads: Reads[MyRequest] = Json.reads[MyRequest] }

Action.async(BodyParsers.parse.json) { request =>
  request.body.validate[MyRequest].map {
    myRequest => 
      JsString(s"f1 is '${myRequest.f1}' f2 is '${myRequest.f2}' f3 is '${myRequest.f3}'")
  }
}