2016-11-15 3 views
0

У меня есть запечатанный черт, как показано ниже:Play Framework 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") 
} 
Смежные вопросы