如何使用圆圈(即从案例类到其字符串表示形式)“展平”对象的JSON表示形式?

时间:2019-05-07 00:55:49

标签: scala circe

我有一个内部使用的自定义Date类:

case class Date(month: Int, day: Int, year: Year)

并这样使用:

case class Person(dateOfBirth: Date)

但是,当我为Person(Date(12, 20, 1990))生成Json时,会得到类似的信息:

{
 "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]],但我正在尝试直接对Vector进行编码,以了解会发生什么情况...

1 个答案:

答案 0 :(得分:6)

您可以手动编写任何类型的编码器/解码器。看来您需要针对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
}