使用 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
定义了 map
和 flatMap
,因此您应该使用 map
将 Reads[List[Int]]
转换为 Reads[MsgValidation]
:
(JsPath \ "mgslist").read[List[Int]].map(MgsValidation.apply _)
我正在使用 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
定义了 map
和 flatMap
,因此您应该使用 map
将 Reads[List[Int]]
转换为 Reads[MsgValidation]
:
(JsPath \ "mgslist").read[List[Int]].map(MgsValidation.apply _)