Play framework 2.5读取可选的过滤器

时间:2016-05-19 11:16:32

标签: json scala playframework

我有以下读取函数来解析JSON文件。

 case class tables(col1 : Option[List[another case class]], col2 : Option[List[another case class]], col3 : Option[List[another case class]], col4 : Option[List[another case class]])


implicit val tablesRead: Reads[tables] = (
        (JsPath \ "col1").read(Reads.optionWithNull[List[data1]]).filterNot(_.get.isEmpty) and
          (JsPath \ "col2").read(Reads.optionWithNull[List[data2]]).filterNot(_.get.isEmpty) and
          (JsPath \ "col3").read(Reads.optionWithNull[List[data3]]).filterNot(_.get.isEmpty) and
          (JsPath \ "col4").read(Reads.optionWithNull[List[data4]]).filterNot(_.get.isEmpty)
        ) (tables.apply _)

我想在验证它之后将JSON插入数据库。因此我宣布了以下功能。

def createFromJson = Action.async(parse.json) { request =>
    request.body.validate[jsonWrapper] match {
      case JsSuccess(data, _) =>
        for {
          dbFuture <- dataFuture(data.userID)
          lastError <- dbFuture.insert(data.tables)
        } yield {
         Ok("Success\n")
        }
      case JsError(errors) => Future.successful(BadRequest("Failed :" + Error.show(errors)))
    }
  }

这可以正常拒绝看起来像这样的JSON:

{"tables":{"col1":[],"col2":[],"col3":[],"col4":[]}, "userID":"irrelavent"}

并接受包含实际数据的JSON,如下所示:

{"tables":{"col1":[{data1}],"col2":[{data2}],"col3":[{data3}],"col4":[{data4}]}, "userID":"irrelavent"}

但是我想要的是能够做到这一点,但也接受带有缺少字段的JSON

{"tables":{"col1":[{data1}],"col2":[],"col3":[{data3}],"col4":[{data4}]}, "userID":"irrelavent"}

最好忽略它们(即返回类似的东西: {"tables":{"col1":[{data1}],"col3":[{data3}],"col4":[{data4}]}, "userID":"irrelavent"}

这可能吗?

非常感谢,

Peter M。

1 个答案:

答案 0 :(得分:1)

您可以使用Reads[tables]宏自动生成具有所需行为的Json.reads

implicit val tablesRead: Reads[tables] = Json.reads[tables]

如果JSON中缺少字段,则列将为None

在次要说明中,scala中的常用表单是以大写字母开头的类名,因此您应将tables重命名为Tables