我使用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。我看不出这个片段有什么问题?
答案 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
的类中发送消息更有意义:)