play:scala Json.format for date

时间:2018-05-04 23:10:17

标签: json scala playframework

我的play-framework api服务器中的Json转换问题已经有一段时间了,并且一直在处理繁琐的解决方法。我认为这是一个简单而常见的问题,因此我想一劳永逸地解决它,以便我可以拥有更易于维护的代码

我需要将case class转换为Json。我一直在努力编写一个jsonify函数,它一个接一个地返回硬编码的成员变量[太繁琐但工作了]

如何为implicit Format提供inner case class?我无法覆盖(并且不知道要覆盖哪种方法,尽管已经反复阅读相关文档)

case class CaseObject (
  id: String,
  title: String,
  createdDate: java.util.Date // here is the problem
) {

}

object CaseObject {
    // is this how to override?
    // val formatter = new SimpleDateFormat("yyyy-MM-dd")
    //  implicit object dateWrites extends Writes[java.util.Date] {
    //    def writes(date: java.util.Date): JsValue = {
    //      JsString(formatter.format(createdDate))
    //    }
    //  }

    implicit val CaseObjectFormat = Json.format[CaseObject]
    implicit val CaseObjectReads = Json.reads[CaseObject]
    implicit val CaseObjectWrites = Json.writes[CaseObject]
    implicit val CaseObjectBson = Macros.handler[CaseObject]

    // tried circe as well...
    private[this] def fmt = new SimpleDateFormat("yyyy-MM- 
    dd'T'HH:mm:ss.SSSZZ")
    implicit val config: Configuration = Configuration.default
    implicit val dateEncoder: Encoder[Date] = 
        Encoder[String].contramap(fmt.format)
    implicit val dateDecoder: Decoder[Date] = 
        Decoder[String].emapTry(str => Try(fmt.parse(str)))

 }

请帮助..我已经为这个微不足道的问题搞砸了好几天..提前致谢!

2 个答案:

答案 0 :(得分:3)

您需要导入通用日期格式

import play.api.data.format.Formats.dateFormat

custom one

implicit val format = dateFormat("yyyy-mm-dd")

答案 1 :(得分:2)

import play.api.libs.json.Json
import java.util.Date


case class CaseObject(
                         id: String,
                         title: String,
                         createdDate: java.util.Date // here is the problem
                       )

implicit val j = Json.format[CaseObject]

val c = CaseObject("1", "new title", new Date())

println(Json.toJson(c))

我不太明白你的问题。如果它是你想要的,那么这个转换为json。