У меня есть пользовательский класс Date
, который мы используем внутри:
case class Date(month: Int, day: Int, year: Year)
И используйте это так:
case class Person(dateOfBirth: Date)
Однако, когда я генерирую Json для Person(Date(12, 20, 1990))
, я получаю что-то вроде:
{
"dateOfBirth": {
"month": 12,
"day": 20,
"year": 1990
}
}
Я бы хотел получить что-то вроде этого:
{ "dateOfBirth": "12-20-2990" } // or any custom format
Можно ли "сгладить" пользовательские классы падежей, чтобы они просто обрабатывались как значения, а не расширялись? Я пробовал что-то вроде этого, и это приводит к StackOverflowError
:
implicit val dateEncoder: Encoder[Date] = (date: Date) => {
Json.fromString(s"${date.month}-${date.dayOfMonth}-${date.year}")
}
ОБНОВЛЕНИЕ : Эта ошибка, похоже, не связана с кодировщиком - она просто срабатывает при добавлении этого кодировщика, но не заставляет меня сделать вывод, что это неправильный способ кодирования. Я принял ответ, поскольку он правильно отвечает на «заданный» вопрос.
Вот кодер, который «выходит из строя» после добавления даты в:
implicit val myEncoder: Encoder[Vector[MyCaseClass]] = (my: Vector[MyCaseClass]) => {
if (my.nonEmpty) my.asJson else Json.Null
}
Я мог бы закодировать это как Option[Vector[MyCaseClass]]
, но я экспериментировал с прямым кодированием вектора, чтобы увидеть, что происходит ...