我有一个Date内部使用的自定义类:
case class Date(month: Int, day: Int, year: Year)
Run Code Online (Sandbox Code Playgroud)
并这样使用:
case class Person(dateOfBirth: Date)
Run Code Online (Sandbox Code Playgroud)
但是,当我为我生成Json时,Person(Date(12, 20, 1990))会得到类似以下内容:
{
"dateOfBirth": {
"month": 12,
"day": 20,
"year": 1990
}
}
Run Code Online (Sandbox Code Playgroud)
我想要得到的是这样的:
{ "dateOfBirth": "12-20-2990" } // or any custom format
Run Code Online (Sandbox Code Playgroud)
是否可以“平铺”自定义案例类,以便将它们仅当作值而不是被扩展?我已经尝试过类似的事情,它导致了StackOverflowError:
implicit val dateEncoder: Encoder[Date] = (date: Date) => {
Json.fromString(s"${date.month}-${date.dayOfMonth}-${date.year}")
}
Run Code Online (Sandbox Code Playgroud)
更新:此错误似乎与编码器无关-添加此编码器时恰好会触发该错误,但不会迫使我得出结论,这不是正确的编码方式。我已经接受了答案,因为它可以正确回答“提问”的问题。
这是在添加日期一之后“失败”的编码器:
implicit val myEncoder: Encoder[Vector[MyCaseClass]] = (my: Vector[MyCaseClass]) => {
if (my.nonEmpty) my.asJson else Json.Null
}
Run Code Online (Sandbox Code Playgroud)
我可以将其编码为,Option[Vector[MyCaseClass]]但是我正在尝试直接对Vector进行编码,以了解会发生什么...
您可以手动编写任何类型的编码器/解码器。看来您需要一个新的实现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
}
Run Code Online (Sandbox Code Playgroud)