【问题标题】:Generating JSON with output dates生成带有输出日期的 JSON
【发布时间】:2016-05-07 14:20:08
【问题描述】:

给定以下案例类:

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。

【问题讨论】:

    标签: scala playframework-2.5


    【解决方案1】:

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

    我认为最好的替代方法(如果您想要自定义文件名)是手动实现 Writes[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]
    

    【讨论】:

    • 当我尝试使用 DefaultLocalDateWrites 时,我收到一条错误消息,提示找不到该函数。我正在导入包含 LocalWrites 的 play.api.libs.json._,有什么想法吗?
    • 尝试直接导入import play.api.libs.json.Writes.DefaultLocalDateWrites。它是play.api.libs.json.DefaultWrites 的一部分,混入play.api.libs.json.Writes 伴生对象。或者只是导入所有内容play.api.libs.json.Writes._
    【解决方案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))
    

    【讨论】:

    • 我在 reportDatesWrite 中遇到同样的错误:使用替代方法写入重载方法值:(t: java.time.LocalDate)(implicit 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)
    猜你喜欢
    • 2018-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-10
    • 2022-01-23
    • 2014-04-12
    • 1970-01-01
    相关资源
    最近更新 更多