У меня есть собственный класс 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
Можно ли «сгладить» пользовательские классы case, чтобы они просто рассматривались как значение, а не расширялись? Я пробовал что-то подобное, и это приводит к 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]]
, но я экспериментировал с прямым кодированием вектора, чтобы посмотреть, что произойдет...
Date
иPerson
? Даже если вы импортируете общие автопроизводные, укажите это в вопросе. - person Koterpillar   schedule 07.05.2019A
внутри неявного определенияEncoder[A]
- он разрешится сам, и вы получите SO. - person Travis Brown   schedule 07.05.2019Decoder.decodeVector
явно, если вам нужно, но определение пользовательского экземпляра дляVector[Whatever]
на самом деле не лучшая практика. В любом случае, это довольно далеко от исходного вопроса, правильный ответ на который приведен ниже. - person Travis Brown   schedule 07.05.2019