のためのScalaのJSONフォーマットは私がのためのScalaのv2.5.6のJSON Format
のためのプレイを生成したいEither
を、受け入れる値クラスを持っています方法が分かった。私が抱えている問題はreads
メソッドです。私は2つのアプローチを試みましたが、どちらも異なる理由で失敗しました。再生/どちらか
import play.api.libs.json._
import play.api.libs.json.Json.obj
object When {
def apply(dateTime: DateTime): When = When(Left(dateTime))
def apply(duration: Duration): When = When(Right(duration))
implicit val whenFormat = new Format[When] {
def reads(json: JsValue): JsResult[When] = {
val reads = (__ \ "dateTime").read[Long] { (millis: Long) =>
When(Left(new DateTime(millis)))
} | (__ \ "duration").read[Long] { (millis: Long) =>
When(Right(new Duration(millis)))
}
reads.reads(json)
}
def writes(o: When): JsValue = obj(
o.when.fold(
duration => "duration" -> duration.getMillis,
dateTime => "dateTime" -> dateTime.getMillis
)
)
}
}
エラーメッセージは次のとおり:
overloaded method value read with alternatives:
[error] (t: Long)play.api.libs.json.Reads[Long] <and>
[error] (implicit r: play.api.libs.json.Reads[Long])play.api.libs.json.Reads[Long]
[error] cannot be applied to (Long => When)
[error] val reads = (__ \ "dateTime").read[Long] { (millis: Long) =>
[error] overloaded method value read with alternatives:
[error] (t: Long)play.api.libs.json.Reads[Long] <and>
[error] (implicit r: play.api.libs.json.Reads[Long])play.api.libs.json.Reads[Long]
[error] cannot be applied to (Long => When)
[error] } | (__ \ "duration").read[Long] { (millis: Long) =>
試み#2、ちょうどreads
方法を示す:
def reads(json: JsValue): JsResult[When] =
JsSuccess(
When(Left(new DateTime((__ \ "dateTime").read[Long]))) ||
When(Right(new Duration((__ \ "duration").read[Long])))
)
を
reads
と
writes
方法の両方を示す
試み#1、
エラーメッセージ:
value || is not a member of When
[error] Note: implicit value whenFormat is not applicable here because it comes after the application point and it lacks an explicit result type
[error] Error occurred in an application involving default arguments.
私はちょうどうまくいくものが好きですし、維持可能で効率的である限り、どのアプローチが使用されても気にしません。これらのアプローチのそれぞれで何が間違っていたのかを知ることも役立ちます。ここで
'When'から' extends AnyVal'を削除しようとしました –
'extends AnyVal'を削除するといずれの方法とも違いはありません –