Scala 生成带有输出日期的JSON

Scala 生成带有输出日期的JSON,scala,playframework-2.5,Scala,Playframework 2.5,鉴于以下案例类别: import java.time.LocalDate case class ReportDateVO(reportDate: LocalDate) 我试图定义隐式json格式: implicit val reportDatesWrite : Writes[ReportDateVO] = ( (JsPath \ "dt").write[LocalDate] ) (unlift(ReportDateVO.unapply)) 但我得到了以下错误: 重载方法值,并

鉴于以下案例类别:

import java.time.LocalDate
case class ReportDateVO(reportDate: LocalDate)
我试图定义隐式json格式:

implicit val reportDatesWrite : Writes[ReportDateVO] = (
      (JsPath \ "dt").write[LocalDate]
  ) (unlift(ReportDateVO.unapply))
但我得到了以下错误:

重载方法值,并使用可选项写入:(t: java.time.LocalDate)(隐式w: play.api.libs.json.Writes[java.time.LocalDate])play.api.libs.json.OWrites[play.api.libs.json.JsValue] (b)w: play.api.libs.json.Writes[java.time.LocalDate])play.api.libs.json.OWrites[java.time.LocalDate] 无法应用于(fdic.ReportDateVO⇒ java.time.LocalDate)


这些替代方案是什么?没有默认格式吗?如何解决这个问题?我正在使用Play2.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))

简而言之,您只能对参数最少为2(最多22)的case类使用JSON组合符。查看文档中的“复杂阅读”部分。组合器对读写操作的作用类似,因此在复杂读部分中的简短解释可能会有所帮助。所以基本上编译器告诉您的是,您不能传递类型为fdic.ReportDateVO的函数⇒ java.time.LocalDate到方法write有点奇怪,因为从逻辑上讲,如果在(JsPath \“dt”).write[LocalDate]周围有括号,它应该返回OWrites[LocalDate]的实例,编译器应该抱怨类型为OWrites[LocalDate]的对象中存在错误的apply方法

我认为最好的替代方法(如果您想要自定义文件名)是手动实现写入[LocalDate]

implicit val reportDatesWrite: Writes[ReportDateVO] = OWrites[ReportDateVO] {
  rdvo: ReportDateVO => Json.obj(
    "dt" -> DefaultLocalDateWrites.writes(rdvo.reportDate)
  )
}
如果字段名可以与case类(reportDate)中的参数名匹配,那么您还可以使用Play helper方法,该方法是使用Scala宏实现的

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

我在ReportDateWrite中也遇到了同样的错误:重载方法值write和可选项:(t:java.time.LocalDate)(隐式w:play.api.libs.json.Writes[java.time.LocalDate])play.api.libs.json.OWrites[play.api.libs.json.JsValue](隐式w:play.api.libs.json.Writes[java.time.LocalDate])play.api.libs.json.OWrites[java.time.LocalDate]无法应用于(fdic.ReportDateVO⇒ java.time.LocalDate)当我尝试使用DefaultLocalDateWrites时,我收到一条错误消息,表示找不到该函数。我正在导入play.api.libs.json.\uu这包括LocalWrites,有什么想法吗?尝试直接导入
import play.api.libs.json.Writes.DefaultLocalDateWrites
。它是
play.api.libs.json.DefaultWrites
的一部分,它与
play.api.libs.json.Writes
伴生对象混合在一起。或者只导入所有内容
play.api.libs.json.Writes.\ucode>