Biorąc pod uwagę następujący JSON ...
{
"recipients" : [
"user1@domain1.com", "user2@domain2.com"
],
"subject" : "My subject",
"body" : "My body"
}
... Muszę zweryfikować listę adresatów ... a poniżej mój kod:
import play.api.libs.json._
import play.api.libs.functional.syntax._
import play.api.libs.json.Reads._
val js = Json.parse("""{"subject":"My subject","body":"My body", "recipients":["user1@domain1.com","user2@domain2.com"]}""")
val validateRecipients = verifyingIf((arr: JsArray) =>
arr.value.nonEmpty)(Reads.list(Reads.email))
val recipients: Reads[JsArray] = {
(__ "recipients).json.pick[JsArray] andThen validateRecipients
}
val validateNotification = (
((__ "recipients).json.copyFrom(recipients)) ~
((__ "subject).json.pickBranch) ~
((__ "body).json.pickBranch)
).reduce
validateNotification.reads(js).fold(
valid = { validated => JsSuccess(validated) },
invalid = { errors => JsError(errors) }
)
Powyższy kod działa zgodnie z oczekiwaniami, tj. Każdy element w recipients
jest zweryfikowany iw przypadku nieprawidłowego adresu e-mail podniesiony został błąd sprawdzania poprawności ... ale załóżmy, że fragment kodu JSON wygląda następująco:
{
"recipients" : [],
"subject" : "My subject",
"body" : "My body"
}
W tym przypadku nie podniesiono błędu sprawdzania poprawności ... ale muszę to zapewnić recipients
zawiera co najmniej jeden element. Czy mogę poprawić mój walidator, aby to osiągnąć?
EDYTOWAĆ
Poniżej znajduje się rozwiązanie sugerowane przez bjfletcher:
val validateRecipients = verifyingIf((arr: JsArray) =>
arr.value.nonEmpty)(Reads.list(Reads.email))
val recipients: Reads[JsArray] = {
(__ "recipients).json.pick[JsArray] andThen verifying[JsArray](_.value.nonEmpty) andThen validateRecipients
}
Mam nadzieję, że to pomoże.
Odpowiedzi:
1 dla odpowiedzi № 1Możesz and
to w:
verifying[JsArray](_.value.length > 0)