Преобразование между классами дел с одинаковой структурой

У меня есть два идентичных случая классов, скажем

case class JsonOutput(
  creationDate: ZonedDateTime,
  updateDate: ZonedDateTime,
  doctorName: String,
  patientName: String,
  userName: String
)

а также

case class DbOutput(
  creationDate: ZonedDateTime,
  updateDate: ZonedDateTime,
  doctorName: String,
  patientName: String,
  userName: String
)

которые структурно одинаковы, но не имеют некоторого отношения (и их сходство может быть изменено в будущем)

Я хочу конвертировать DbOutput тип, который я получаю из базы данных в JsonOutput, который позже я буду использовать для преобразования (от Play Json), как

//fullCase is of type JsonOutput
Ok(Json.obj("case" -> fullCase))

Как бы я это сделал?

Замечания:

И что делать в случае вложенной структуры класса case:

case class GeneralInfo(number: Int)

// Nested case class structure
case class JsonOneOutput(text: String)
case class JsonThreeOutput(meta: JsonOneOutput, info: GeneralInfo)

// Nested case class structure    
case class DbOneOutput(text: String)
case class DbThreeOutput(meta: DbOneOutput, info: GeneralInfo)

где я снова должен конвертировать DbOutput в JsonOutput (и все типы одинаковы, за исключением некоторых типов листовых узлов, таких как DbOneOutput а также JsonOneOutputчто может быть на глубоком уровне)

1 ответ

Вы, кажется, хотите сделать это с бесформенным, поэтому я бы посоветовал вам взглянуть на документацию. Пример того, как этого можно достичь:

import shapeless.Generic

object FooBar {

  case class Foo(a: String, b: Int, c: String)
  case class Bar(x: String, y: Int, z: String)

  def main(args: Array[String]): Unit = {
    val genFoo = Generic[Foo]
    val genBar = Generic[Bar]

    println(genBar.from(genFoo.to(Foo("foobar", 5, "barfoo"))))
  }

}
Другие вопросы по тегам