Play Framework 2.5序列化JSON特征

时间:2016-11-15 10:04:32

标签: json playframework

我有一个密封的特征,如下所示:

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 个答案:

答案 0 :(得分: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")
}