使用输出日期生成JSON

时间:2016-05-06 21:21:41

标签: 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))

但是我收到以下错误:

  

重载方法值写入替代方案:(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)

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

2 个答案:

答案 0 :(得分:1)

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))

答案 1 :(得分:1)

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

我认为最好的选择(如果您想拥有自定义文件名)是手动实施写入[LocalDate]

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

如果字段名称可以与案例类(reportDate)中的参数名称匹配,那么您还可以使用使用Scala宏实现的Play帮助程序方法。

implicit val reportDatesWrite: Writes[ReportDateVO] = Json.writes[ReportDateVO]
相关问题