/ / Play Framework: W jaki sposób sprawdzić poprawność tablicy JSON i upewnić się, że zawiera ona co najmniej jeden element - json, scala, playframework

Play Framework: Jak sprawdzić poprawność tablicy JSON i upewnić się, że zawiera co najmniej jeden element - json, scala, playframework

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 № 1

Możesz and to w:

verifying[JsArray](_.value.length > 0)