Mam następującej konfiguracji:dostarczaniu wartości dla pojedynczych ukrytą w grze Json biblioteki
sealed trait Status
case object Edited extends Status
case object NotEdited extends Status
case class Tweet(content:String, status:Status)
chcę użyć odtwarzania formatu JSON, więc myślę, że muszę mieć coś takiego (nie chcę robić to w obiekcie towarzysz):
trait JsonImpl{
implicit val TweetFormat = Json.format[Tweet]
implicit val statusFormat = Json.format[Status]
implicit val StatusFormat = Json.format[Edited.type]
implicit val NotEditedFormat = Json.format[NotEdited.type]
}
ale kompilator narzeka i mówi:
No implicit format for Tweet available.
Mówi się również, że nie można używać Edited.type
, ponieważ wymaga zastosowania i anulowania funkcji. Co powinienem zrobić?
Edit1:
mogę myśleć o coś takiego:
implicit object StatusFormat extends Format[Status] {
def reads(json: JsValue) =
(json \ "type").get.as[String] match {
case "" => Edited
case _ => UnEdited
}
def writes(stat: Status) = JsObject(Seq(
stat match {
case Edited => "type" -> JsString("Edited")
case NotEdited => "type" -> JsString("UnEdited")
}
))
}
ale read
część ma problemu, kompilator narzeka, że musi JsonResult nie Edited.type
to "__" naprawdę dwa podkreślenia (tyle symboli do zapamiętania :))? gdzie jest symetria? (spróbuj nauczyć się wyglądać "funkcjonalnie" w dzisiejszych czasach, czy polecasz http://www.manning.com/bjarnason/ czy coś lepszego?) – Omid
Tak, to naprawdę '__'. Możesz napisać 'JsPath', jeśli ci się nie podoba. Jestem też sceptyczny wobec ciężkich bibliotek operatora, ale Play JSON ma tylko kilku operatorów i myślę, że są całkiem rozsądni. –