在play和scala中请求body到case类的转换

Sun*_*mar 2 json scala playframework-2.0

我有一个类似的案例类在这里找到:

case class WebCategory(topGroupName: String,
                       topGroupID: String,
                       webCategoryName : String,
                       webCategoryID : String,
                       subWebCats:Seq[SubWebCat])

case class SubWebCat(name:String, id:String)
Run Code Online (Sandbox Code Playgroud)

我的请求主体json具有与case类完全相同的键名.例如:

{
  "webCategoryID" : "blah",
  "webCategoryName" : "abcabc",
  "topGroupID" : "blah",
  "topGroupName" : "namehere",
  "subWebCats" : [
    {
      "name" : "blah",
      "id" : "idblah"
    },
            {
      "name" : "another blah",
      "id" : "another idblah"
    } 

  ]

}
Run Code Online (Sandbox Code Playgroud)

case class和req body键是相同的,那么是否可以直接从请求json构建case类对象?如果有可能那我该怎么办呢?任何参考都会有帮助.如果不可能,那么这意味着我要定义我在答案中解释的自定义隐式转换器,其中我没有任何实现它的问题.

注意:我正在使用Play 2.3和Scala 11进行开发

Rya*_*yan 9

您可以非常轻松地使用Play的内置JSON验证.您无需为此添加任何第三方依赖项.

case class WebCategory(topGroupName: String,
                       topGroupID: String,
                       webCategoryName : String,
                       webCategoryID : String,
                       subWebCats:Seq[SubWebCat])

object WebCategory {
  implicit val fmt = Json.format[WebCategory]
}

case class SubWebCat(name:String, id:String)

object SubWebCat {
  implicit val fmt = Json.format[SubWebCat]
}
Run Code Online (Sandbox Code Playgroud)

然后,在您的控制器操作中:

def save: Action(parse.json) { implicit request =>
  request.body.validate[WebCategory].fold(
    errors => BadRequest(errors.mkString),
    category => Ok("saved category")
  )
}
Run Code Online (Sandbox Code Playgroud)