是否可以限制读取中列表的大小

时间:2019-07-25 17:01:14

标签: playframework-2.6

我的控制器收到一个jsonjson中的元素之一是字符串数组。我为validation

写了以下json
  implicit val pQ:Reads[PQ] = (
    (JsPath \ "id").readNullable[UUID] and
    (JsPath \ "description").read[String] and
      (JsPath \ "h").read[List[String]] and
      (JsPath \ "i").read[List[String]] and
      (JsPath \ "s").read[String] and
      (JsPath \ "t").read[Set[String]] and
    )(PQ.apply _)

是否可以编写ReadsValidate,以便如果List的大小大于指定值(例如{{1的大小),则拒绝json }}列表应不超过3个?

1 个答案:

答案 0 :(得分:0)

我可能会在代码更具功能性和组织性的地方写另一个答案。很高兴也接受其他答案。

自定义验证json的方法是扩展Reads特征并实现其reads方法。

abstract def reads(json: JsValue): JsResult[A]

我想实现两件事 1)验证json是否具有所有必填字段 2)确保某些字段具有最大大小限制(例如,可以发送的图像数量)。

Json验证通过调用validate的{​​{1}}或validateOpt方法来工作。这些方法期望隐式JsValue并将Reads传递给它。

JsValue

因此,要验证json并将其映射到我的def validate[T](implicit rds: Reads[T]): JsResult[T] = rds.reads(this)类,我必须创建一个PQ。但是,由于我不仅要验证Reads[PQ]的结构,因此必须扩展json并实现自己的Reads

要执行步骤1,我以常规方式创建了reads(只需检查所有必填字段是否存在并可以映射到我的Reads[PQ]

PQ

要添加步骤2,我通过扩展implicit val pQStructurallyCorrect:Reads[PQ] = ( (JsPath \ "id").readNullable[UUID] and (JsPath \ "description").read[String] and (JsPath \ "h").read[List[String]] and (JsPath \ "i").read[List[String]] and (JsPath \ "s").read[String] and (JsPath \ "t").read[Set[String]] and )(PQ.apply _) 并覆盖了Reads[PQ]

创建了另一个Read[PQ]
reads

现在要验证json,我使用implicit object PQReads extends Reads[PQ] { def reads(json:JsValue):JsResult[PQ] = { //check that the structure of the json is correct by utilizing the Reads created for step 1 val structurallyValidated = json.validateOpt[PQ](pQStructurallyCorrect) structurallyValidated match { case JsSuccess(pQOpt,path)=>{ //structure is correct. now check content val result = pQOpt.map(pq=>{ if(pq.image.length <0 || pq.image.length > 3) { JsError("invalid no. of images") } else { JsSuccess(pq) } }).getOrElse(JsError("Error in validating Json")) result } case JsError(errors) =>{ JsError(errors) } } } } 对象

PQReads

上面发生的是当我的应用程序接收到json

1)它首先从传入的请求中将主体作为json

implicit val qReads:Reads[Q] = (JsPath \ "p-q").read[PQ](PQReads)
    .map((x:PQ)=>Q.apply (x))

2)然后验证json

val jsonBodyOption = body.asJson

val qOption = jsonBody.validateOpt[Q] //this uses qReads:Reads available implicitly 使用qReads来验证PQReadsjson首先调用PQReads,并通过validateOpt来检查结构。如果结构正确,则检查图像pQStructurallyCorrect的长度。