我有以下读取函数来解析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。
答案 0 :(得分:1)
您可以使用Reads[tables]
宏自动生成具有所需行为的Json.reads
:
implicit val tablesRead: Reads[tables] = Json.reads[tables]
如果JSON中缺少字段,则列将为None
。
在次要说明中,scala中的常用表单是以大写字母开头的类名,因此您应将tables
重命名为Tables
。