我々はplay-json-extensionsを使用せずに達成することができます。私たちは以下のような22の以上のフィールドの場合クラスがあるとします。
case class Foo(
A: Int,
B: Option[Int],
C: String,
D: Option[String],
E: Seq[String],
F: Date
more fields..
)
今、私たちは分割し、グループのフィールドをいくつかのグループにおよびフォーマットを記述します。
val fooFormat1: OFormat[(Int, Option[Int], String)] =
((__ \ "A").format[Long]
~ (__ \ "B").format[Option[Long]]
~ (__ \ "C").format[Option[Long]]).tupled
val fooFormat2: OFormat[(Option[String], Seq[String], Date)] =
((__ \ "D").format[Long]
~ (__ \ "E").format[Option[Long]]
~ (__ \ "F").format[Option[Long]]).tupled
最後に、すべてのフォーマットを1つのフォーマットにマージします。
私たちは以下のような機能の構文をインポートする必要が
implicit val fooFormat: Format[Foo] = (fooFormat1 ~ fooFormat2)({
case ((a, b, c), (d, e, f)) =>
new Foo(a, b, c, d, e, f)
}, (foo: Foo) => ((
foo.A,
foo.B,
foo.C
), (
foo.D,
foo.E,
foo.F
)))
:今
import play.api.libs.functional.syntax._
、遊びはオプションで、日付フィールドをデシリアライズ/シリアライズすることはできません。そこで、我々は、以下のようなオプションで、日付フィールドの暗黙のフォーマットを記述する必要があります。私たちはを書くために必要なすべてのです
は implicit object DateFormat extends Format[java.util.Date] {
val format = new java.text.SimpleDateFormat("yyyy-MM-dd")
def reads(json: JsValue): JsResult[java.util.Date] = JsSuccess(format.parse(json.as[String]))
def writes(date: java.util.Date): JsString = JsString(format.format(date))
}
implicit def optionFormat[T: Format]: Format[Option[T]] = new Format[Option[T]] {
override def reads(json: JsValue): JsResult[Option[T]] = json.validateOpt[T]
override def writes(o: Option[T]): JsValue = o match {
case Some(t) => implicitly[Writes[T]].writes(t)
case None => JsNull
}
}
よりフィールドよりもケースクラスのを書き込みます。
バリュークラスを試しましたか? – FaigB
バリュークラス?ごめんなさい。それを私に説明してもらえますか? – sowmiyaksr
http://docs.scala-lang.org/overviews/core/value-classes.html – FaigB