如何使一个方法将任何case类作为参数并将其用作类型

时间:2015-12-04 07:41:59

标签: json scala playframework

我正在使用play框架及其JSON解析器play.api.libs.json,我有一些用于执行JSON解析的case类。 我想验证请求json是有效还是无效,所以我想将isValidJson方法添加到我的trait中,所有json请求的case类都扩展但我不知道如何将case类调用为{{1来自特质。

这是我的问题,我如何变成一个方法,将json和任何case类作为参数,如果json与case类匹配,则返回验证结果,或者不从下面的代码中返回?

Type

提前致谢

1 个答案:

答案 0 :(得分:1)

您可以这样做:

def isValidRequest[T: Reads](implicit request: Request[JsValue]) =
  request.body.asOpt[T].isDefined

然后您可以将其用作isValidRequest[Foo],如果Foo的Reader可以正确读取请求正文中的json,它将返回true。另请注意,这是编译安全的,即如果您编写isValidRequest[Bar]并且您没有在范围中定义Reads[Bar],那么它将无法编译。

虽然坦率地说,如果你的目标是用Bad Request回击,那么在你的控制器中内联它可能更好。即:

def get() = Action { implicit request =>
  request.body.asOpt[Foo].map(
    doSomething(_)
      .map(Ok("Great!")
  .getOrElse(BadRequest)
}