Play JSON 读取错误,范围内需要隐式

Play JSON Reads Error With Needed Implicits in Scope

我有一个简单的 JSON 使用 play json 库读写:

  val dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"
  implicit val jodaDateTimeReads: Reads[DateTime] = Reads[DateTime](js =>
    js.validate[String].map[DateTime](dt =>
      DateTime.parse(dt, DateTimeFormat.forPattern(dateFormat))
    )
  )

  implicit val jodaDateTimeWrites: Writes[DateTime] = new Writes[DateTime] {
    def writes(dt: DateTime): JsValue = JsString(dt.toString())
  }

我正在尝试使用此 DateTime 来解析我的案例之一 class,即

case class DefaultMessage(timestamp: DateTime)

我在范围内有相应的读写,DateTime 的读写也在范围内:

implicit val defaultMessageReads: Reads[DefaultMessage] = (
  (JsPath \ "timestamp").read[DateTime](jodaDateTimeReads)
)(DefaultMessage.apply _)

我收到一条错误消息:

[error]  found   : org.joda.time.DateTime => com.my.project.messages.DefaultMessage
[error]  required: play.api.libs.json.Reads[?]
[error]         )(DefaultMessage.apply _)

这意味着什么?我认为 Reads[DefaultMessage] 的签名满足隐式 val defaultMessageReads。我看不出这段代码有什么问题?

这似乎是一个疯狂的问题!似乎 Play Json 不喜欢带有单个参数的 case classes。我不得不将案例 class 更改为:

case class DefaultMessage(message: String, timestamp: DateTime)

然后是读写格式排序:

implicit val defaultMessageReads: Reads[DefaultMessage] = (
  (__ \ "message").read[String] and
  (__ \ "timestamp").read[DateTime](jodaDateTimeReads)
)(DefaultMessage.apply _)

implicit val defaultMessageWrites: Writes[DefaultMessage] = (
  (JsPath \ "message").write[String] and
  (JsPath \ "timestamp").write[DateTime](jodaDateTimeWrites)
)(unlift(DefaultMessage.unapply))

给你。

case class DefaultMessage(timestamp: DateTime)
object DefaultMessage{
  val dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"
  implicit val reads: Reads[DefaultMessage] =
    (json: JsValue) => (json \ "timestamp").validate[String]
      .map(t => DefaultMessage(DateTime.parse(t, DateTimeFormat.forPattern(dateFormat))))
}

您不需要为此更改您的大小写 class,尽管在 class 中发送一条名为 DefaultMessage:)[=12= 的消息更有意义]