我有以下配置:提供隱含值在播放JSON庫單身
sealed trait Status
case object Edited extends Status
case object NotEdited extends Status
case class Tweet(content:String, status:Status)
我想使用播放JSON格式,所以我想我必須有這樣的事情(我不想做它的同伴對象):
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]
}
但編譯器抱怨說:
No implicit format for Tweet available.
另外它說我不能使用Edited.type
,因爲它需要應用和不應用功能。我該怎麼辦?
EDIT1:
我能想到的是這樣的:
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")
}
))
}
但read
部分有問題,編譯器會抱怨它需要JsonResult不Edited.type
'__'確實是兩個下劃線(需要記住很多符號:))?對稱性在哪裏? (儘量學會近期「功能性」,你推薦http://www.manning.com/bjarnason/或更好的東西?) – Omid
是的,它確實是'__'。如果你不喜歡,你可以寫'JsPath'。我對運營商型的圖書館也持懷疑態度,但Play JSON只有一些運營商,我認爲它們非常合理。 –