【问题标题】:Play JSON Reads Error With Needed Implicits in Scope在范围内使用所需的隐式播放 JSON 读取错误
【发布时间】:2018-06-20 21:51:21
【问题描述】:

我使用 play json 库进行简单的 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 来解析我的一个案例类

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。我看不出这个 sn-p 有什么问题?

【问题讨论】:

    标签: json scala playframework-2.0 case-class


    【解决方案1】:

    你去。

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

    您不需要为此更改案例类,尽管在名为 DefaultMessage 的类中包含消息更有意义:)

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-05-26
        • 2021-10-30
        • 1970-01-01
        • 2016-03-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多