Есть ли простой способ (один вкладыш) добавить дополнительные свойства к выводу json без необходимости писать свои Json .writes - PullRequest
0 голосов
/ 09 января 2020
import play.api.libs.json.JsonConfiguration.Aux
import play.api.libs.json._

case class EmailStats(id: Int, providerId: String, stats: Option[String])

case class Email(id: Int = 0, createdAt: Option[String], updatedAt: Option[String]) {

  implicit val config: Aux[Json.MacroOptions] = JsonConfiguration(SnakeCase)
  implicit def format: OFormat[Email] = Json.using[Json.WithDefaultValues].format[Email]
  implicit val writes: OWrites[Email] = Json.writes[Email]
  implicit val reads:  Reads[Email]   = Json.reads[Email]

  private var emailStats: Seq[EmailStats] = Seq[EmailStats]()

  def getEmailStats(): Seq[EmailStats] = emailStats
}

Сериализация вывода:

{"id": 0, "created_at": "01/08/2020 00:00:12","created_at": "01/09/2020 01:56:05"}

Есть ли способ добавить дополнительное свойство или метод к записи, чтобы он отображал дополнительные JSON?

{"id": 0, "created_at": "01/08/2020 00:00:12","created_at": "01/09/2020 01:56:05", "email_stats": [...]}

Я не хочу делать следующее:

implicit val writes: Writes[Email] = (email: Email) => Json.obj(
  "id" -> email.id,
  "created_at" -> email.createdAt,
  "updated_at" -> email.updatedAt
  "email_stats" -> email.getEmailStats.map(stat=>Json.toJson(stat))
)

Спасибо.

Ответы [ 2 ]

1 голос
/ 10 января 2020
implicit val emailFormat: OFormat[Email] = {
  val f = Json.using[Json.WithDefaultValues].format[Email]

  OFormat(f, email => {
    f.writes(email) + ("email_stats" -> Json.toJson(email.getEmailStats))
  }
}

Кстати, обычно последствия добавляются к объекту-компаньону, а не к самому классу дела.

0 голосов
/ 09 января 2020

Вот решение, если вы можете настроить Классы дел :

import play.api.libs.json._

  case class EmailStats(id: Int, providerId: String, stats: Option[String] = None)
  object EmailStats {
    implicit def format: OFormat[EmailStats] = Json.using[Json.WithDefaultValues].format[EmailStats]

  }
  case class Email(id: Int = 0, createdAt: Option[String], updatedAt: Option[String], emailStats: Seq[EmailStats]) {
  }
  object Email {
    implicit def format: OFormat[Email] = Json.using[Json.WithDefaultValues].format[Email]

  }
  1. Настроить конструкторы (добавлено emailStats).

  2. Добавьте средства форматирования в Сопутствующие объекты .

Вот пример:

val jsonStr = """{"id": 0, "createdAt": "01/08/2020 00:00:12","updatedAt": "01/09/2020 01:56:05", "emailStats": [{"id": 3, "providerId": "provider" }]}
              |""".stripMargin

Json.parse(jsonStr).validate[Email] // -> JsSuccess(Email(0,Some(01/08/2020 00:00:12),Some(01/09/2020 01:56:05),List(EmailStats(3,provider,None))),)

Дайте мне знать если вам нужно больше объяснений.

Помните, что я изменил некоторые свойства на CamelCase, чтобы упростить пример.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...