合計型 ( など) をシリアル化/逆シリアル化する必要があることがよくありますがEither[S,T]
、それを行うための一般的またはエレガントな方法をまだ見つけていません。これがタイプの例です(本質的には と同等ですEither
)
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 n@NumericOutcome(_) => Json.obj("NumericOutcome" -> Json.toJson(n)(fmtNumeric))
case q@QualitativeOutcome(_) => Json.obj("QualitativeOutcome" -> Json.toJson(q)(fmtQualitative))
}
def reads(json: JsValue) = (
Json.fromJson(json \ "NumericOutcome")(fmtNumeric) orElse
Json.fromJson(json \ "QualitativeOutcome")(fmtQualitative)
)
}
}