【问题标题】:Joda DateTime Format in Play 2.6 is not workingPlay 2.6 中的 Joda DateTime 格式不起作用
【发布时间】:2018-03-27 15:30:58
【问题描述】:

尝试迁移我的代码玩 2.6 一切都很好,除了 DateTime 类型的格式。

作为迁移的一部分,我确实添加了 play-json-joda 作为依赖项。

但是,像这样:

case class GeoArea(id: Option[Int] = None,
                   continentId: Option[Int] = None,
                   countryId: Option[Int] = None,
                   code: String,
                   name: String,
                   discr: Discriminator.Value,
                   createdAt: DateTime = DateTime.now,
                   updatedAt: DateTime = DateTime.now,
                   deletedAt: Option[DateTime] = None,
                   createdBy: Option[String] = None,
                   updatedBy: Option[String] = None)

格式对象定义为:

implicit lazy val geoAreaFormat: Format[GeoArea] = Json.format[GeoArea]

我收到一个错误:

没有 play.api.libs.json.Format 的实例可用于 org.joda.time.DateTime, org.joda.time.DateTime, scala.Option[org.joda.time.DateTime] 在隐式范围内(提示:如果 在同一个文件中声明,确保之前声明过)[错误]
隐式惰性 val geoAreaFormat: Format[GeoArea] = Json.format[地理区域]

我错过了什么?我还需要什么来解决这个问题?

我的导入如下所示:

import driver.PGDriver.api._
import org.joda.time.DateTime
import play.api.libs.json._
import slick.lifted.Tag
import model.GeoAreas.Discriminator
import converters.{JsonEnumeration, SlickEnumeration}

它们并没有像迁移期间那样发生变化,但这些足以让一切正常工作。

【问题讨论】:

标签: json scala datetime playframework jodatime


【解决方案1】:

在你的 build.sbt 中添加:

libraryDependencies += "com.typesafe.play" % "play-json-joda_2.12" % "2.6.0"

然后在你的模型文件中导入这个:

import play.api.libs.json.JodaWrites._
import play.api.libs.json.JodaReads._

【讨论】:

  • 是的! (Y)
【解决方案2】:

我在搬到新图书馆的同时也遇到了这种不便。您可以通过基于其新默认值创建隐式格式来解决此问题。

implicit val dateFormat = new OFormat[DateTime] {
    override def reads(json: JsValue): JsResult[DateTime] = JodaReads.DefaultJodaDateTimeReads.reads(json)
    override def writes(o: DateTime): JsValue = JodaWrites.JodaDateTimeWrites.writes(o)
}

请注意,以上内容不包括使用 epoch millis 的旧默认写入。为确保您的迁移不会破坏现有功能,您可能希望保留旧的默认值:

implicit val dateFormatDefault = new Format[DateTime] {
    override def reads(json: JsValue): JsResult[DateTime] = JodaReads.DefaultJodaDateTimeReads.reads(json)
    override def writes(o: DateTime): JsValue = JodaDateTimeNumberWrites.writes(o)
}

这是因为 play-json 中的旧默认值使用了 millis (https://github.com/playframework/play-json/blob/master/play-json/jvm/src/main/scala/play/api/libs/json/EnvWrites.scala#L326-L328):

@deprecated("Include play-json-joda as a dependency and use JodaWrites.JodaDateNumberWrites", "2.6.0")
object DefaultJodaDateWrites extends Writes[DateTime] {
    def writes(d: DateTime): JsValue = JsNumber(d.getMillis)
}

而新的默认使用 ISO8601 (https://github.com/playframework/play-json/blob/b4f812df628787e2d83131ceafbecb0d6d769704/play-json-joda/src/main/scala/play/api/libs/json/JodaWrites.scala#L33-L35):

/**
 * Default Serializer LocalDate -> JsString(ISO8601 format (yyyy-MM-dd))
 */
implicit object JodaDateTimeWrites extends Writes[DateTime] {
   def writes(d: DateTime): JsValue = JsString(d.toString)
}

【讨论】:

    【解决方案3】:

    您应该使用nscala-time time,它是Joda 的包装器

    然后为 Json 格式化程序创建此对象

    package formatters
    
    import org.joda.time.{DateTime, DateTimeZone}
    import org.joda.time.format.ISODateTimeFormat
    import play.api.libs.json.{JsString, JsSuccess, JsValue, Format}
    
    object DateTimeFormatter {
      private lazy val ISODateTimeFormatter = ISODateTimeFormat.dateTime.withZone(DateTimeZone.UTC)
      private lazy val ISODateTimeParser = ISODateTimeFormat.dateTimeParser
    
      implicit val dateTimeFormatter = new Format[DateTime] {
        def reads(j: JsValue) = JsSuccess(ISODateTimeParser.parseDateTime(j.as[String]))
        def writes(o: DateTime): JsValue = JsString(ISODateTimeFormatter.print(o))
      }
    }
    

    在你的伴生对象中

    object GeoArea {
      import formatters.DateTimeFormatter._
      implicit val geoAreaFormat = Json.format[GeoArea]
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-06
      • 2015-01-24
      • 1970-01-01
      • 2017-01-11
      • 2015-08-25
      • 1970-01-01
      • 2012-07-08
      • 1970-01-01
      相关资源
      最近更新 更多