播放JSON读取范围内需要的隐含错误

时间:2018-01-11 14:21:22

标签: json scala playframework-2.0 case-class

我使用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。我看不出这个片段有什么问题?

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

你去。

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的类中发送消息更有意义:)