使用 Play2 和 Scala 进行 json 验证时出错

Error in json validation using Play2 with Scala

我正在使用 Play Framework 2.3 Json 来自 U.I 的包含整数列表

的请求到达我的控制器

我想验证它并将其解析为 Scala 列表,所以我正在使用 隐式读取

我面临的问题是,当我只使用这样的列表实现读取时

case class MgsValidation(  mgsidlist : List[Int]) 
object MgsValidation{
  implicit val readmgs : Reads[MgsValidation] = (
      (JsPath \ "mgslist").read[List[Int]]
      )(MgsValidation.apply _)
}

我收到以下错误

overloaded method value read with alternatives:

[error] (t: List[Int])play.api.libs.json.Reads[List[Int]]

[error] (implicit r: play.api.libs.json.Reads[List[Int]])play.api.libs.json.Reads[List[Int]]

[error] cannot be applied to (List[Int] => models.JsonParsing.MgsValidation)

[error] (JsPath \ "mgslist").read[List[Int]]

但是如果我像这样添加任何其他随机参数

case class MgsValidation( uuid :Int , mgsidlist : List[Int]) 
object MgsValidation{
  implicit val deleteread : Reads[MgsValidation] = (
      (JsPath \ "uuid").read[Int] and
      (JsPath \ "mgslist").read[List[Int]]
      )(MgsValidation.apply _)
}

效果很好

但我只想简单地验证和解析列表

我该怎么做?

另外请告诉我为什么这个 Reads 可以在多个参数下正常工作?

这里有一个技巧:当你使用组合器时 and 当你不使用时,你的表达式没有相同的类型。

scala> :t (JsPath \ "mgslist").read[List[Int]]
play.api.libs.json.Reads[List[Int]]

但是:

scala> :t ((JsPath \ "mgslist").read[List[Int]] and (JsPath \ "mgslist").read[List[Int]])
play.api.libs.functional.FunctionalBuilder[play.api.libs.json.Reads]#CanBuild2[List[Int],List[Int]] = play.api.libs.functional.FunctionalBuilder$CanBuild2@134e0422

第二种定义了相应的apply方法,所以你可以在后面传递case class' apply函数。另一方面,Reads 定义了 mapflatMap,因此您应该使用 mapReads[List[Int]] 转换为 Reads[MsgValidation] :

  (JsPath \ "mgslist").read[List[Int]].map(MgsValidation.apply _)