0

PlayFramework 2.1 では、json を読み込んでケース クラスを作成したいと考えています。構造が違うのでデフォルトのリーダーは使えません。両方の文字列を java.util.Date にマージするには、何を書く必要がありますか?

import play.api.libs.functional.syntax._
import play.api.libs.json._
import play.api.libs.json.util._
import play.api.libs.json.Reads._

case class Person(name: String, lastSeen: Date)
val jsonString = Json.parse("""{name: "Joe", day: "2013-03-28", time: "09:35"}""")

val personLastSeen: Reads[Person] = (
  (__ \ "name").read[String] ~
  // (__ \ "day").read[String] (__ \ "time").read[String] // @TODO
)(Person)

この読み取りを交換する必要がありますか?試しval dateStructure = new SimpleDateFormat("yyyy-MM-dd HH:mm")てみましたが、そこdateStructure.parse(...)に必要だと思いますReads[Date]

4

1 に答える 1

3

Reads[T] コンビネータを使用してこれを行うことはできないと思いますが、特性 Reads とそのメソッドを定義できますdef read(json: JsValue): JsResult[T]

import play.api.libs.functional.syntax._
import play.api.libs.json._
import play.api.libs.json.util._
import play.api.libs.json.Reads._
import java.util.Date
import java.text.SimpleDateFormat

case class Person(name: String, lastSeen: Date) {      
}

object Person {
  implicit val personLastSeen = new Reads[Person] {
    val sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm")
    def reads(js: JsValue): JsResult[Person] = {
      JsSuccess(Person(
        (js \ "name").as[String],
        sdf.parse((js \ "day").as[String] + " " + (js \ "time").as[Float])))
    }
  }
}
object Test extends App {
    val jsonString = Json.parse("""{name: "Joe", day: "2013-03-28", time: "09:35"}""")
}
于 2013-03-28T12:58:58.087 に答える