Как декодировать дату, вложенную в массив в circe? - PullRequest
1 голос
/ 19 октября 2019

Как бы вы расшифровали поле Date из объекта JSON, вложенного в массив JSON?

Пример JSON:

[
  {
    "msys": {
      "relay_message": {
        "content": {
          "headers": [
            {
              "Date": "Mon, 4 Jul 2016 15:53:14 +0100"
            },
            {
              "Message-ID": "<484810298443-112311-xqxbby@mail.there.com>"
            }
          ],
          "html": "<p>Hi there <strong>SparkPostians</strong>.</p>",
          "subject": "We come in peace",
          "text": "Hi there SparkPostians.",
          "to": [
            "your@yourdomain.com"
          ]
        },
        "msg_from": "me@here.com",
      }
    }
  }
]

Возникли проблемы с доступом к дате, поскольку она вложена в заголовкимассив. У кого-нибудь есть идеи?

case class InboundEmail(recipients: Recipients, from: String, content: Content)
case class Recipients(to: List[String], cc: Option[List[String]])
case class Content(subject: String, body: String)

object InboundEmail {
  implicit val decoder: Decoder[InboundEmail] = (c: HCursor) ⇒
    for {
      toList  <- c.downArray.downField("msys").downField("relay_message").downField("content").downField("to").as[List[String]]
      ccList  <- c.downArray.downField("msys").downField("relay_message").downField("content").downField("cc").as[Option[List[String]]]
      from    <- c.downArray.downField("msys").downField("relay_message").downField("msg_from").as[String]
      subject <- c.downArray.downField("msys").downField("relay_message").downField("content").downField("subject").as[String]
      body    <- c.downArray.downField("msys").downField("relay_message").downField("content").downField("html").as[String]
    } yield {
      new InboundEmail(Recipients(toList, ccList), from, Content(subject: String, body: String))
  }
}

1 Ответ

1 голос
/ 19 октября 2019

Вы можете добавить следующее к вашему пониманию, чтобы извлечь дату как Option [String]

        date <- c.downArray.downField("msys").downField("relay_message").downField("content").downField("headers").as[List[Map[String, String]]].map(_.find(_.contains("Date")).flatMap(_.get("Date")))
...