【问题标题】:Error in json validation using Play2 with Scala使用带有 Scala 的 Play2 进行 json 验证时出错
【发布时间】:2015-10-03 03:37:54
【问题描述】:

我正在使用 Play Framework 2.3 从 UI 向我的控制器发出的 Json 请求包含整数列表

我想验证并将其解析为 scala 列表,所以我使用 implicit Reads

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

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

我收到以下错误

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

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

[错误](隐式 r: play.api.libs.json.Reads[List[Int]])play.api.libs.json.Reads[List[Int]]

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

[错误] (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 在多个参数下都能正常工作?

【问题讨论】:

    标签: json scala validation playframework-2.3


    【解决方案1】:

    这里有个技巧:当你使用组合器 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类的apply函数。另一方面,Reads 上定义了mapflatMap,因此您应该使用mapReads[List[Int]] 转换为Reads[MsgValidation]

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-23
    • 1970-01-01
    • 1970-01-01
    • 2018-08-02
    相关资源
    最近更新 更多