Json 播放2.6中的Joda DateTime格式不起作用
尝试将我的代码迁移到play 2.6 除了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 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)