使用scala管理Play2控制器上的JSON错误

时间:2012-05-16 08:30:12

标签: json scala playframework-2.0

这是我对scala的第一次体验。我尝试使用Play2制作一个小型REST控制器。

我的主要目标是让POST路由中包含一些json数据。

这就是我已经做过的事情:

def instMeasurement(variable: String) = Action { request =>
    request.body.asJson.map { json =>
        val measurement = MongoDBObject(
            "variable" -> variable,
             "quantity" -> (json \ "quantity").asOpt[Float].getOrElse(BadRequest("Missing parameter [quantity]")),
             "when" -> (json \ "occurTime").asOpt[String].getOrElse(BadRequest("Missing parameter [occurTime]")))

        dao("powermeter").save(measurement)

        Ok(json)
    }.getOrElse(
        BadRequest(Json.toJson("JSON Body missing"))
    )
}

一切正常,解决了错误过程。我想路由到BadRequest。

Play 2纪录片显示了一个小例子:

def sayHello = Action { request =>
  request.body.asJson.map { json =>
    (json \ "name").asOpt[String].map { name =>
      Ok("Hello " + name)
    }.getOrElse {
      BadRequest("Missing parameter [name]")
    }
  }.getOrElse {
    BadRequest("Expecting Json data")
  }
}

听起来很完美,但它没有显示如何在json中处理多个值。

如何使用json中的2个值(例如,name和firstname)执行相同的操作? 如果json没有完成,我如何解析json并路由到BadRequest?

1 个答案:

答案 0 :(得分:0)

如果我理解正确,您想要处理多个缺少的字段。我的解决方案看起来像这样:

    val fields = List("firstname", "lastname")
    val options = fields.map(name => (json \ name).asOpt[String])
    val errors = options.zip(fields).collect { 
         case (None, f) => f
   }

   if(errors.isEmpty){  Ok(options.flatten.mkString(" "))} 
   else { BadRequest("Missing Fields: " + errors.mkString(" \n "))