Как «сгладить» JSON-представление объектов с помощью circe, т. Е. Из case-класса в его строковое представление? - PullRequest
0 голосов
/ 07 мая 2019

У меня есть пользовательский класс 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]], но я экспериментировал с прямым кодированием вектора, чтобы увидеть, что происходит ...

1 Ответ

6 голосов
/ 07 мая 2019

Вы можете написать кодировщик / декодер для любого типа вручную.Кажется, вам нужна новая реализация для Date:

object Date {
  implicit val encoder: Encoder[Date] = (date: Date) =>
    Json.fromString(s"${date.day}-${date.month}-${date.year}")
  implicit val decoder: Decoder[Date] = ??? // if you need this
}
...