我正在使用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
我该怎么做?
还请告诉我为什么读取可以使用多个参数正常工作?
答案 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
上定义了map
和flatMap
,因此您应该使用map
将Reads[List[Int]]
转换为Reads[MsgValidation]
:
(JsPath \ "mgslist").read[List[Int]].map(MgsValidation.apply _)