Мне часто приходится сериализовать/десериализовать типы сумм (например, 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 [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)
)
}
}