Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Json 播放2.6中的Joda DateTime格式不起作用_Json_Scala_Datetime_Playframework_Jodatime - Fatal编程技术网

Json 播放2.6中的Joda DateTime格式不起作用

Json 播放2.6中的Joda DateTime格式不起作用,json,scala,datetime,playframework,jodatime,Json,Scala,Datetime,Playframework,Jodatime,尝试将我的代码迁移到play 2.6 除了DateTime类型的格式之外,一切都很好 作为迁移的一部分,我添加了play json joda作为依赖项 然而,类似这样的情况: case class GeoArea(id: Option[Int] = None, continentId: Option[Int] = None, countryId: Option[Int] = None,

尝试将我的代码迁移到play 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)
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}
格式对象定义为:

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](提示:如果 在同一文件中声明,请确保在[错误]之前声明 隐式lazy val geoAreaFormat:格式[GeoArea]= Json.format[GeoArea]

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

我的导入内容如下所示:

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

它们在迁移过程中没有发生变化,但这些已经足够让一切正常工作了。

在您的构建中。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._

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

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)
}
但请注意,上述内容不包括使用历元毫秒的旧默认写入。为了确保迁移不会破坏现有功能,您可能希望保留旧的默认设置:

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)
}
这是因为旧的默认播放json使用了millis():

新的默认使用ISO8601():

你应该用时间来包装你的生活

然后为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]
}

(还有)第一个讲的是剧本2.3,它与2.6不同。另外两个完全无关。Joda.DateTime有一个标准格式。我可能不知道如何使用它。不,例如,这个答案是关于2.6(它来自我的第一个链接):那么,这是否意味着在2.6中我必须定义我自己的?没有默认的实现?仅供参考,该项目现在正在进行中,团队建议迁移到类。看,是的!(Y)