Scala Json海岸到海岸播放框架:序列化Joda DateTime
大家好,我是新来玩框架,如果有人知道一个更好的方法,然后在下面提到,请让我知道 所以我有一个模型和读/写/格式Scala Json海岸到海岸播放框架:序列化Joda DateTime,scala,playframework-2.2,scala-2.10,reactivemongo,Scala,Playframework 2.2,Scala 2.10,Reactivemongo,大家好,我是新来玩框架,如果有人知道一个更好的方法,然后在下面提到,请让我知道 所以我有一个模型和读/写/格式 case class Schedule (startDate: DateTime, endDate: DateTime) object ScheduleSerializers { val userDateFormatter = "dd/MM/yyyy HH:mm:ss" val nonImplicitUserFormatter = DateTimeFormat.forP
case class Schedule (startDate: DateTime, endDate: DateTime)
object ScheduleSerializers {
val userDateFormatter = "dd/MM/yyyy HH:mm:ss"
val nonImplicitUserFormatter = DateTimeFormat.forPattern("dd/MM/yyyy HH:mm:ss")
implicit val jodaDateTimeReads = Reads.jodaDateReads(userDateFormatter)
implicit val jodaDateTimeWrites = Writes.jodaDateWrites(userDateFormatter)
implicit val readSchedule: Reads[Schedule] = (
(__ \ "startDate").read[String].map[DateTime](dt => DateTime.parse(dt, nonImplicitUserFormatter)) and
(__ \ "endDate").read[String].map[DateTime](dt => DateTime.parse(dt, nonImplicitUserFormatter))
)(Schedule)
implicit val writeSchedule: Writes[Schedule] = (
(__ \ "startDate").write[String].contramap[DateTime](dt => nonImplicitUserFormatter.print(dt)) and
(__ \ "endDate").write[String].contramap[DateTime](dt => nonImplicitUserFormatter.print(dt))
)(unlift(Schedule.unapply))
implicit val formatSchdule = Format(readSchedule, writeSchedule)
}
现在我打开游戏控制台并执行此操作
val sch = Json.parse(""" {
|
| "schedule" : { "starDate" : "04/02/2011 20:27:05" , "endDate" : "04/02/2011 20:27:05" }
| }
| """)
sch: play.api.libs.json.JsValue = {"schedule":{"starDate":"04/02/2011 20:27:05","endDate":"04/02/2011 20:27:05"}}
sch.validate[Schedule]
res0: play.api.libs.json.JsResult[models.experiment.Schedule] = JsError(List((/endDate,List(ValidationError(error.path.missing,WrappedArray()))), (/startDate,List(ValidationError(error.path.missing,WrappedArray())))))
我收到一个错误,但如果我尝试为ex解析一个日期:
scala> val singleDate = Json.parse(""" "04/02/2011 20:27:05" """)
singleDate: play.api.libs.json.JsValue = "04/02/2011 20:27:05"
singleDate.validate[DateTime]
res1: play.api.libs.json.JsResult[org.joda.time.DateTime] = JsSuccess(2011-02-04T20:27:05.000-08:00,)
我不明白为什么“singleDate”有效,但“Schedule”模型的验证失败了。
提前感谢您,我们将感谢您的帮助。错误非常清楚:“路径丢失” 而不是:
(__ \ "startDate") ...
(__ \ "endDate") ...
您必须给出实际路径:
(__ \ "schedule" \ "startDate") ...
(__ \ "schedule" \ "endDate") ...
顺便说一句,当您将jodatetimereads
定义为implicit
时,您不需要手动执行PASSING。当你读和写的时候,只需使用格式
这就足够了:
implicit val formatSchedule: Format[Schedule] = (
(__ \ "startDate").read[DateTime] and
(__ \ "endDate").read[DateTime]
)(Schedule.apply, unlift(Schedule.unapply)))
试试这些:
implicit val dateWrites = jodaDateWrites("yyyy-MM-dd'T'HH:mm:ss.SSSZ")
implicit val dateReads = jodaDateReads("yyyy-MM-dd'T'HH:mm:ss.SSSZ")
这不是因为路径不匹配吗?您需要有类似于
(\uuuu\“schedule”\“startDate”)的内容。。。在您的Reads对象中。