使用输出日期生成 JSON

Generating JSON with output dates

给定以下情况class:

import java.time.LocalDate
case class ReportDateVO(reportDate: LocalDate)

我正在尝试定义隐式 json 格式:

implicit val reportDatesWrite : Writes[ReportDateVO] = (
      (JsPath \ "dt").write[LocalDate]
  ) (unlift(ReportDateVO.unapply))

但我收到以下错误:

overloaded method value write with alternatives: (t: java.time.LocalDate)(implicit w: play.api.libs.json.Writes[java.time.LocalDate])play.api.libs.json.OWrites[play.api.libs.json.JsValue] (implicit w: play.api.libs.json.Writes[java.time.LocalDate])play.api.libs.json.OWrites[java.time.LocalDate] cannot be applied to (fdic.ReportDateVO ⇒ java.time.LocalDate)

这些替代方案是什么?没有默认格式?如何解决这个问题?我正在使用 Play 2.5.2.

PlayJson 只为 Int、String、Double 等基本类型提供序列化程序 - LocalDate 不是其中之一。

你的想法是对的,但需要更具体一些,先为 LocalDate 定义 Combinator:

   implicit val LocalDateWrites: Writes[LocalDate] = Writes {
        (l: LocalDate) => JsString(l.toString())
   }

    implicit val reportDatesWrite : Writes[ReportDateVO] = (
        (JsPath \ "dt").write[LocalDate]
    ) (unlift(ReportDateVO.unapply))

简短的回答是,您只能将 JSON 组合器用于 case classes,参数数量最少为 2(最多 22)。查看 JSON Reads/Writes/Format Combinators 的文档,第 复杂读取 部分。组合器对于读取和写入的工作方式类似,因此 Complex Reads 部分中的简短说明可能会有所帮助。所以基本上编译器告诉你的是你不能将 fdic.ReportDateVO ⇒ java.time.LocalDate 类型的函数传递给方法 write 有点奇怪,因为从逻辑上讲,如果 (JsPath \ "dt").write[LocalDate],应该 return OWrites[LocalDate] 的实例,编译器应该报错 OWrites[LocalDate].

类型对象中的 apply 方法

我认为最好的选择(如果你想要自定义文件名)是手动实现 Writes[LocalDate]

implicit val reportDatesWrite: Writes[ReportDateVO] = OWrites[ReportDateVO] {
  rdvo: ReportDateVO => Json.obj(
    "dt" -> DefaultLocalDateWrites.writes(rdvo.reportDate)
  )
}

如果字段名称可以与参数名称匹配 class (reportDate) 那么您也可以使用使用 Scala 宏实现的 Play 辅助方法。

implicit val reportDatesWrite: Writes[ReportDateVO] = Json.writes[ReportDateVO]