scala - 如何使用 circe 将对象的 JSON 表示“展平”,即从案例类到其字符串表示?
问题描述
我有一个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]]
但我正在尝试直接编码 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
}
推荐阅读
- node.js - 我想以笔记本电脑作为服务器将我的 node.js 网站部署到域名
- php - 引用对象 PHP 中的计数
- python - 结构化的numpy ndarray,如何获取值
- python - 为什么这两个相同的列表表现不同?
- jquery - 在 ajax 生成的内容中加载 JS 文件
- perl - Perl 中的取消引用哈希在 Docker 容器中不起作用
- c# - .NET Core EF - 从自定义 DbCommand 获取日志记录输出
- c# - 如何解决以下代码中的错误?
- html - 使用 shiny::includeHTML() 时无法呈现 blogdown 站点
- mysql - 如何在 MySQL 中找到当时的最低值(圈记录)?