sum型をシリアル化/逆シリアル化する必要があります(Either[S,T]
など)。ここで(Either
と本質的に同等)の例タイプScalaのPlayで複数のケースクラス(Sum型)を持つJsonシリアライゼーション
sealed trait OutcomeType
case class NumericOutcome(units: String) extends OutcomeType
case class QualitativeOutcome(outcomes: List[String]) extends OutcomeType
だ。ここのシリアル化を実装コンパニオンオブジェクトで私のベストエフォートです。それはうまくいきますが、すべての和型についてこれらのことを何度も繰り返し書くことは非常に面倒です。それをより良く、より一般的にするための提案はありますか?
import play.api.libs.json._
import play.api.libs.functional.syntax._
object OutcomeType {
val fmtNumeric = Json.format[NumericOutcome]
val fmtQualitative = Json.format[QualitativeOutcome]
implicit object FormatOutcomeType extends Format[OutcomeType] {
def writes(o: OutcomeType) = o match {
case [email protected](_) => Json.obj("NumericOutcome" -> Json.toJson(n)(fmtNumeric))
case [email protected](_) => Json.obj("QualitativeOutcome" -> Json.toJson(q)(fmtQualitative))
}
def reads(json: JsValue) = (
Json.fromJson(json \ "NumericOutcome")(fmtNumeric) orElse
Json.fromJson(json \ "QualitativeOutcome")(fmtQualitative)
)
}
}
あなたはjson4s HTTPを試してみました/json4s.org? また、遊びで使用したい場合は、https://github.com/tototoshi/play-json4s をご覧になるか、自分で実装してください。 –
いいですね。あなたはplay2.5へのあなたの最善の努力を更新できますか?ありがとう! – qed
心配しないで、私はplay2.5でこれを行う方法を見つけて答えに入れました。 – qed