Play Framework 2 无法正确验证 Json 数组(内部代码)
Play Framework 2 cannot properly validate Json Arrays (code inside)
我想使用 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]
,一切正常。关于如何调整验证以使其适用于数组的任何提示?
找到解决方案,只需使用 .validate[Array[Pet]] 即可开箱即用。
我想使用 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]
,一切正常。关于如何调整验证以使其适用于数组的任何提示?
找到解决方案,只需使用 .validate[Array[Pet]] 即可开箱即用。