我想使用Play上传一个JSON实体数组。
我的模型看起来像这样:
case class Pet(name: String, age: Int)
object Pet {
implicit val petReads: Reads[Pet] = (
(JsPath \ "name").read[String](minLength[String](2)) and
(JsPath \ "age").read[Int](min(0))
)(Pet.apply _)
)
我的JSON输入是一个JSON数组条目。例如:
'[{"name": "Scooby","age":7},{"name": "Toothless","age": 3}]'
处理条目的操作是:
def create = Action(BodyParsers.parse.json) { implicit request =>
val entries = request.body.validate[Seq[Pet]]
entries.fold(errors => {BadRequest(Json.obj("status" -> "Bad Request", "message" -> JsError.toJson(errors)))},
elements => {//do something with it
Ok(Json.obj("status" -> "OK", "message" -> (Json.toJson("Done."))))})
}
我希望我的验证能够检测到价值问题。例如,如果string.length < 2
或age
号为负数。
然而,对于.validate[Seq[Pet]]
的数组,它不起作用。名称为length < 2
的条目可以通过验证。
如果我尝试将每个条目作为简单的JSON条目(不是json数组)单独上传并使用.validate[Pet]
代替,那么一切正常。有关如何调整验证以使其适用于数组的任何提示吗?
答案 0 :(得分:0)
找到解决方案,只需使用.validate [Array [Pet]],它就可以开箱即用。