2016-11-15 49 views
0

我有一個密封的特點是象下面這樣:播放框架2.5序列化JSON性狀

sealed trait MyMessages 

object MyMessages { 

    case object Init extends MyMessages 
    case object Destroy extends MyMessages 
    case class Tick(elem: Long) extends MyMessages 
} 

我要寫信序列化和反序列化到和從該JSON格式化。這是我想出的:

implicit object MyMessagesWrites extends Writes[MyMessages] { 
    def writes(myMessages: MyMessages): JsValue = myMessages match { 
     case Init => Json.toJson("INIT") 
     case Destroy => Json.toJson("DESTROY") 
     case tick: Tick => Json.toJson(Tick) 
    } 

    def reads(json: JsValue): MyMessages = { 
     // How do I get from JSValue to a MyMessages type??? 
    } 
    } 

實現寫入很容易,但我如何實現讀取?

回答

1

假設你序列化Tick實例作爲裸JSON號碼,我會做它像這樣:

implicit object MyMessageReads extends Reads[MyMessages] { 
    def reads(json: JsValue) = json match { 
    case JsString("INIT") => JsSuccess(MyMessages.Init) 
    case JsString("DESTROY") => JsSuccess(MyMessages.Destroy) 
    case JsNumber(n) => JsSuccess(Tick(n.toLongExact)) 
    case e => JsError(s"Invalid message: $e") 
    } 
} 

請注意,您還可以使讀/寫操作更簡潔一點,通過使用更多的功能風格:

implicit val myMessagesWrites = Writes[MyMessages] { 
    case Init => JsString("INIT") 
    case Destroy => JsString("DESTROY") 
    case Tick(n) => JsNumber(n) 
} 

implicit val myMessageReads = Reads[MyMessages] { 
    case JsString("INIT") => JsSuccess(MyMessages.Init) 
    case JsString("DESTROY") => JsSuccess(MyMessages.Destroy) 
    case JsNumber(n) => JsSuccess(Tick(n.toLongExact)) 
    case e => JsError(s"Invalid message: $e") 
}