2

Scalaのドキュメントに従ってクラスを実装しました

case class Creature(
  name: String, 
  isDead: Boolean, 
  weight: Float,
  dob: java.sql.Date
)

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

implicit val creatureFormat = (
  (__ \ "name").format[String] and
  (__ \ "isDead").format[Boolean] and
  (__ \ "weight").format[Float] and
  (__ \ "dob").format[java.sql.Date]
)(Creature.apply, unlift(Creature.unapply))

次に、このように json ラッパーを呼び出し、{"name": "John Doe", "isDead": false, "weight": 100.0, "dob": "2013-03-17" }Json.toJson(Creature("John Doe", false, 100.0, new java.sql.Date(1363456800000)))のような出力が表示されることを期待します。代わりに、{"name": "John Doe", "isDead": false, "weight": 100.0, "dob": 1363456800000 }のような出力が得られます。

データベースでは、生年月日が 2013-03-17 であることに注意してください。

4

3 に答える 3

1

これが私がそれを解決した方法です(適用および適用解除メソッドを明示的に定義しました)

val sdf = new java.text.SimpleDateFormat("yyyy-MM-dd")
implicit val creatureFormat = (
  (__ \ "name").format[String] and
  (__ \ "isDead").format[Boolean] and
  (__ \ "weight").format[Float] and
  (__ \ "dob").format[String])
    (((name, isDead, weight, dob) => Creature(name, isDead, weight, new java.sql.Date(sdf.parse(dob).getTime()))),
    unlift((cr: Creature) => Some(cr.name, cr.isDead, cr.weight, sdf.format(cr.dob))))

より良い解決策があるかどうかはわかりません。

アップデート

最後に、java.sql.Date のフォーマッターを実装しました。

import play.api.libs.json._
import play.api.libs.functional.syntax._
import play.api.data.validation.ValidationError
import play.api.libs.json.{ Json => PlayJson, _ }

case class Creature(
  name: String, 
  isDead: Boolean, 
  weight: Float,
  dob: java.sql.Date
)

implicit val sqlDateWrite = new Format[SqlDate] {
  def reads(json: JsValue) = json match {
    case JsString(d) => {
      val theDate = new SqlDate(sdf.parse(d).getTime)
      if (d.matches(sdfPattern) && theDate.compareTo(new Date(0)) > 0) JsSuccess(new SqlDate(sdf.parse(d).getTime))
      else JsError(Seq(JsPath() -> Seq(ValidationError("validate.error.expected.date.in.format(dd-MM-yyyy)"))))
    }
    case _ => JsError(Seq(JsPath() -> Seq(ValidationError("validate.error.expected.date.in.String"))))
  }

  def writes(sd: SqlDate): JsValue = JsString(sdf.format(sd))
}

implicit val creatureFormat = PlayJson.format[Creature]

さて、これらの行は両方とも機能します

val mcJson = PlayJson.toJson(Creature("John Doe", false, 100, new SqlDate(1368430000000L)))
val mcObj = PlayJson.fromJson[Creature](PlayJson.obj("name"-> "Abul Khan", "isDead"-> true, "weight"-> 115, "dob"-> "17-05-2011")).getOrElse(null)
于 2013-05-07T11:32:08.793 に答える
1

デフォルトでは、java.util.Date Json シリアライザーは、日付のタイムスタンプを含む数値を生成します。

または、日付の表現を含む文字列を生成する日付シリアライザーを使用できます。ただし、JSON には日付の標準表現がないため、テキスト表現を生成するために使用するパターンを明示的に指定する必要があります。

implicit val creatureFormat = (
  (__ \ "name").format[String] and
  (__ \ "isDead").format[Boolean] and
  (__ \ "weight").format[Float] and
  (__ \ "dob").format(sqlDateWrites("YYYY-MM-DD"))(sqlDateReads("YYYY-MM-DD"))
)(Creature.apply, unlift(Creature.unapply))
于 2013-05-15T10:20:44.150 に答える