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= 的消息更有意义]
我有一个简单的 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= 的消息更有意义]