我的控制器收到一个json
。 json
中的元素之一是字符串数组。我为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 _)
是否可以编写Reads
或Validate
,以便如果List的大小大于指定值(例如{{1的大小),则拒绝json
}}列表应不超过3个?
答案 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
来验证PQReads
。 json
首先调用PQReads
,并通过validateOpt
来检查结构。如果结构正确,则检查图像pQStructurallyCorrect
的长度。