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

时间:2015-07-14 13:12:36

标签: json scala validation playframework-2.3

我正在使用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 _)
}

我收到以下错误

  

使用替代方法读取重载的方法值:

     

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

     

[错误](隐含的r:   play.api.libs.json.Reads [列表[INT]])play.api.libs.json.Reads [列表[INT]]

     

[error]无法应用于(List [Int] =>   models.JsonParsing.MgsValidation)

     

[error](JsPath \“mgslist”)。读取[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 _)
}

一切正常

但我想简单地验证和解析List

我该怎么做?

还请告诉我为什么读取可以使用多个参数正常工作?

1 个答案:

答案 0 :(得分:2)

这里有一个技巧:当你使用组合器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方法,因此您可以在之后传递案例类“apply”。另一方面,Reads上定义了mapflatMap,因此您应该使用mapReads[List[Int]]转换为Reads[MsgValidation]

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