2016-08-18 59 views
0

我要上傳使用播放實體的JSON數組。播放框架2不能正確驗證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 < 2age數字是負數。

但是它不會爲陣列,.validate[Seq[Pet]]工作。名稱爲length < 2的條目可以通過驗證。

如果我嘗試每個條目分別上載一個簡單的JSON條目(不是JSON數組),並使用.validate[Pet]代替,一切工作正常。任何提示如何調整驗證,以便它適用於數組?

+0

有關使用方法:https://github.com/eclipsesource/play-json-schema-validator? –

+0

如果'validate'對單個條目起作用,並且'entries'是這樣的條目的數組,那麼爲什麼'forEach'或'map'無法跨越'entries'進行驗證呢? 'request.body.map(x => x.validate [Seq [Pet]]'或類似的東西?(注意:我不知道具體的方法,所以我不知道如何精確地做到這一點。 ) –

+0

是的,我想過他們,但是scala的迭代函數沒有一個可以在'request.body'上使用。 – Mnemosyne

回答

0

找到解決方案,只需使用.validate [數組[[寵物]],它可以開箱即用。