2016-08-18 8 views
0

Playを使用してエンティティのJSON配列をアップロードしたいとします。Play Framework 2がJson Arrays(コード内)を正しく検証できない

私のモデルは次のようになります。

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

どのように使用して:https://github.com/eclipsesource/play-json-schema-validator? –

+0

'validate'が単一のエントリで動作し、' entries'がそのようなエントリの配列である場合、 'forEach'や' map'が 'entries'を越えて' validate'するのはなぜですか? 'request.body.map(x => x.validate [Seq [Pet]]'なのか、それとも何か?(注意:特定のメソッドがわからないので、これを正確に行う方法がわかりません。 ) –

+0

はい、私はそれらについて考えましたが、scalaの反復関数のどれも 'request.body'で使用できません。 – Mnemosyne

答えて

0

解決策が見つかりました.validate [Array [Pet]]を使用するだけでそのまま使用できます。

関連する問題