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

Json 如何使方法以任何case类作为参数并将其用作类型,json,scala,playframework,Json,Scala,Playframework,我正在使用play框架和它的JSON解析器play.api.libs.JSON,我有一些case类来进行JSON解析。 我想验证请求json是否有效,因此我想向trait添加isValidJson方法,所有json请求的case类都扩展了该方法,但我不知道如何从trait中将case类称为Type 这里是我的问题,如果json与下面的代码中的case类匹配或不匹配,我如何转换成一个以json和任何case类为参数并返回验证结果的方法 val isValidRequest = { reques

我正在使用play框架和它的JSON解析器play.api.libs.JSON,我有一些case类来进行JSON解析。 我想验证请求json是否有效,因此我想向trait添加
isValidJson
方法,所有json请求的case类都扩展了该方法,但我不知道如何从trait中将case类称为
Type

这里是我的问题,如果json与下面的代码中的case类匹配或不匹配,我如何转换成一个以json和任何case类为参数并返回验证结果的方法

val isValidRequest = {
  request.body.validate[CaseClassOfSomething](Json.format[CaseClassOfSomething]).map {
    case x:CaseClassOfSomething =>
      true
  }.recoverTotal{
    case e => false
  }
}

提前感谢

您可以这样做:

def isValidRequest[T: Reads](implicit request: Request[JsValue]) =
  request.body.asOpt[T].isDefined
然后,您可以将其用作
isValidRequest[Foo]
,如果
Foo
的读取器能够正确地从请求体读取json,则返回true。还请注意,这是编译安全的,即如果您编写
isValidRequest[Bar]
,并且没有在范围中定义
读取[Bar]
,那么它将不会编译

尽管坦率地说,如果你只是想回击
错误的请求
,那么最好将其嵌入控制器中。i、 e:

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