Как заставить Цирцею пропустить определенные значения из перечисления? - PullRequest
1 голос
/ 03 мая 2019

У нас есть "перечисление", например:

sealed abstract class StatusEnumeration(val value: String)
case object Status {
  case object Mine extends StatusEnumeration("mine")
  case object Someone extends StatusEnumeration("someone")
  case object Neighbor extends StatusEnumeration("neighbor")
  case object Unknown extends StatusEnumeration("unknown")
}

Эта структура продиктована нашим доменом / потребностями. Однако я хотел бы преобразовать этот StatusEnumeration в выходной JSON, например, так:

case class Root(status: StatusEnumeration)

Я установил следующий неявный кодер, и он работает как положено:

implicit val encoder = deriveEnumerationEncoder[StatusEnumeration]

Однако, , если , StatusEnumeration установлен на Status.Unknown Я бы хотел пропустить генерацию значения Или просто вывести null вместо этого (который я затем могу отбросить с помощью dropNullValues). Как я могу сделать что-то подобное? Это вообще возможно или мне нужно переопределить другой набор перечислений?

Пока это то, что я пытался, когда @Alec также прокомментировал попробовать что-то подобное:

implicit val encoder = deriveEnumerationEncoder[StatusEnumeration].mapJson(x=>{

    x.asString match {
      case Some("Unknown") => Json.Null
      case Some(s) => Json.fromString(s.toLowerCase) // output expect lowercase - not sure if the consumer is case-sensitive
      case None => Json.Null
    }

  })

Это, кажется, работает как ожидалось. Это рекомендуемый способ или есть лучший?

1 Ответ

2 голосов
/ 03 мая 2019

Не пытался скомпилировать это, но на основе скаладоков вы должны быть в состоянии сделать:

implicit val encoder = Encoder.encodeOption(deriveEnumerationEncoder[StatusEnumeration])
  .contramap {
    case Unknown => None
    case known => Some(known)
  }

По сути, создайте кодировщик Option[StatusEnumeration], затем сопоставьте StatusEnumeration с этим соответствующим образом (я уверен, что кодировщик для Option помещает None как null и Some(x) как x в кодировке) .

...