2

こんにちは、私はフレームワークをプレイするのが初めてです。誰かがより良いアプローチを知っている場合は、以下に記載してください。

だから私はモデルとそのための読み取り/書き込み/フォーマットを持っています

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」モデルの検証は失敗します。事前に感謝します。

4

2 に答える 2

1

これらを試してください:

implicit val dateWrites = jodaDateWrites("yyyy-MM-dd'T'HH:mm:ss.SSSZ")
implicit val dateReads = jodaDateReads("yyyy-MM-dd'T'HH:mm:ss.SSSZ")

https://github.com/playframework/playframework/blob/master/framework/src/play-json/src/main/scala/play/api/libs/json/Writes.scala#L411

https://github.com/playframework/playframework/blob/master/framework/src/play-json/src/main/scala/play/api/libs/json/Reads.scala#L645

于 2015-10-07T03:23:47.873 に答える
1

エラーはかなり明確です:「パスがありません」。

それ以外の:

 (__ \ "startDate") ...
 (__ \ "endDate") ...

実際のパスを指定する必要があります:

 (__ \ "schedule" \ "startDate") ...
 (__ \ "schedule" \ "endDate") ...

ちなみに、 as と定義jodaDateTimeReadsしてimplicitいるので、手動でパージングする必要はありません。そして、読み取りと書き込みは同じことをしているので、そのまま使用してくださいFormat

それは十分なはずです:

implicit val formatSchedule: Format[Schedule] = (
  (__ \ "startDate").read[DateTime] and
  (__ \ "endDate").read[DateTime]
)(Schedule.apply, unlift(Schedule.unapply)))
于 2014-05-30T11:31:59.633 に答える