Często muszę serializować/deserializować typy sum (jak Either[S,T]
) i nie znalazłem jeszcze ogólnego lub eleganckiego sposobu, aby to zrobić. Oto przykład typ (zasadniczo równoważne Either
)Serializacja Json dla cechy z wieloma klasami przypadków (typy sum) w grze Scala
sealed trait OutcomeType
case class NumericOutcome(units: String) extends OutcomeType
case class QualitativeOutcome(outcomes: List[String]) extends OutcomeType
Oto mój najlepszy wysiłek w obiekcie towarzysz, który implementuje serializacji. Działa, ale pisanie tego rodzaju rzeczy za każdym razem jest bardzo męczące dla każdego rodzaju sumy. Czy są jakieś sugestie, aby uczynić je ładniejszymi i/lub bardziej ogólnymi?
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)
)
}
}
Czy próbowałeś json4s http://json4s.org? Również jeśli chcesz go używać z grą, powinieneś zajrzeć tutaj: https://github.com/tototoshi/play-json4s lub zaimplementować to samemu. –
Wygląda miło. Czy mógłbyś zaktualizować swój najlepszy wysiłek, by grać2.5? Dzięki! – qed
Nieważne, dowiedziałem się, jak to zrobić w play2.5 i umieścić w odpowiedzi. – qed