Обработка нестандартных вложенных операций чтения Json - PullRequest
0 голосов
/ 26 мая 2019

Итак, у меня есть следующий JSON:

{
  "senderEmail" : "sender@email.com",
  "recipientEmails" : ["first@email.com", "second@email.com"]
}

и я хочу сопоставить его с классом дел:

case class Payload (senderEmail: String, recipientEmails: Seq[String])

, используя Json Reads Play с валидатором электронной почты.

Хотя для senderEmail это тривиально, у меня возникают проблемы с recipientEmails, поскольку он Seq и электронная почта, поэтому не работает:

implicit val payloadRead: Reads[Payload] = (
    (JsPath \ "senderEmail").read[String](Reads.email) and
    (JsPath \ "recipientEmails").read[Seq[String]](Reads.seq))(Payload.apply _)

I 'm получение overloaded method value read with alternatives.

Так как же объединить оба файла Reads.seq и Reads.email?

1 Ответ

4 голосов
/ 26 мая 2019

Просто будь проще ...

scala> import play.api.libs.json._

scala> import play.api.libs.functional.syntax._

scala> case class Payload (senderEmail: String, recipientEmails: Seq[String])
defined class Payload

scala> implicit val reads: Reads[Payload] = (
     |   (JsPath \ "senderEmail").read(Reads.email) and
     |   (JsPath \ "recipientEmails").read(Reads.seq(Reads.email))
     | )(Payload.apply _)
reads: play.api.libs.json.Reads[Payload] = play.api.libs.json.Reads$$...

scala> Json.parse("""{
     |   "senderEmail" : "sender@email.com",
     |   "recipientEmails" : ["first@email.com", "second@email.com"]
     | }""").validate[Payload]
res0: play.api.libs.json.JsResult[Payload] = JsSuccess(Payload(sender@email.com,Vector(first@email.com, second@email.com)),)
...