Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
自定义json RootJsonFormat或JsonFormat,具体取决于json对象中的值_Json_Scala_Akka_Akka Stream_Spray Json - Fatal编程技术网

自定义json RootJsonFormat或JsonFormat,具体取决于json对象中的值

自定义json RootJsonFormat或JsonFormat,具体取决于json对象中的值,json,scala,akka,akka-stream,spray-json,Json,Scala,Akka,Akka Stream,Spray Json,在Akka streams连接中,我接收的JSON对象如下所示: {"op":"connection"...} {"op":"status"...} ..etc 我有以下课程设置: case class ResponseMessage( op: Option[OpType], ) case class ConnectionMessage( a: Option[Int], b: Option[Int], ) extends ResponseMessage case class S

在Akka streams连接中,我接收的JSON对象如下所示:

{"op":"connection"...}
{"op":"status"...}
..etc
我有以下课程设置:

case class ResponseMessage(
  op: Option[OpType],
)

case class ConnectionMessage(
  a: Option[Int],
  b: Option[Int],
) extends ResponseMessage

case class StatusMessage(
  c: Option[Int],
  d: Option[Int],
) extends ResponseMessage

type OpTypes = OpTypes.Value
object OpTypes extends Enumeration {
  val Connection = Value("connection")
  val Status = Value("status")
如何编写自定义JsonFormat实例,以便根据
op
I的值是否创建了正确的类型? 因此,可以这样使用它:


注意:扩展案例类(即ResponseMessage)不是最佳做法。谷歌“案例类继承”

关于您关于
JsonFormat
的问题,我将为每个子类定义特定的
JsonFormat
s,然后根据以下内容为
ResponseMessage
定义一个:

import spray.json._

abstract class ResponseMessage(val op: Option[OpTypes])
object ResponseMessage {
  implicit object jsonFormat extends JsonFormat[ResponseMessage] {
    override def read(json: JsValue): ResponseMessage = json match {
      case JsObject(fields) =>
        fields.get("op") match {
          case Some(JsString("connection")) => json.convertTo[ConnectionMessage]
          case Some(JsString("status")) => json.convertTo[StatusMessage]
          case op => // unknown op
        }
      case _ => // invalid json
    }

    override def write(obj: ResponseMessage): JsValue = obj match {
      case connection: ConnectionMessage => connection.toJson
      case status: StatusMessage => status.toJson
    }
  }
}

case class ConnectionMessage(
                              a: Option[Int],
                              b: Option[Int]
                            ) extends ResponseMessage(Some(OpTypes.Connection))
object ConnectionMessage {
  implicit object jsonFormat extends JsonFormat[ConnectionMessage] {
    override def read(json: JsValue): ConnectionMessage =
      // json -> ConnectionMessage

    override def write(obj: ConnectionMessage): JsValue =
      // ConnectionMessage -> json
  }
}

case class StatusMessage(
                          c: Option[Int],
                          d: Option[Int]
                        ) extends ResponseMessage(Some(OpTypes.Status))
object StatusMessage {
  implicit object jsonFormat extends JsonFormat[StatusMessage] {
    override def read(json: JsValue): StatusMessage =
      // json -> StatusMessage

    override def write(obj: StatusMessage): JsValue =
      // StatusMessage -> json
  }
}

type OpTypes = OpTypes.Value

object OpTypes extends Enumeration {
  val Connection = Value("connection")
  val Status = Value("status")
}

这行吗。。模式匹配可以是op.value匹配{“连接”=>value(“连接”)“状态”=>value(“状态”)}
import spray.json._

abstract class ResponseMessage(val op: Option[OpTypes])
object ResponseMessage {
  implicit object jsonFormat extends JsonFormat[ResponseMessage] {
    override def read(json: JsValue): ResponseMessage = json match {
      case JsObject(fields) =>
        fields.get("op") match {
          case Some(JsString("connection")) => json.convertTo[ConnectionMessage]
          case Some(JsString("status")) => json.convertTo[StatusMessage]
          case op => // unknown op
        }
      case _ => // invalid json
    }

    override def write(obj: ResponseMessage): JsValue = obj match {
      case connection: ConnectionMessage => connection.toJson
      case status: StatusMessage => status.toJson
    }
  }
}

case class ConnectionMessage(
                              a: Option[Int],
                              b: Option[Int]
                            ) extends ResponseMessage(Some(OpTypes.Connection))
object ConnectionMessage {
  implicit object jsonFormat extends JsonFormat[ConnectionMessage] {
    override def read(json: JsValue): ConnectionMessage =
      // json -> ConnectionMessage

    override def write(obj: ConnectionMessage): JsValue =
      // ConnectionMessage -> json
  }
}

case class StatusMessage(
                          c: Option[Int],
                          d: Option[Int]
                        ) extends ResponseMessage(Some(OpTypes.Status))
object StatusMessage {
  implicit object jsonFormat extends JsonFormat[StatusMessage] {
    override def read(json: JsValue): StatusMessage =
      // json -> StatusMessage

    override def write(obj: StatusMessage): JsValue =
      // StatusMessage -> json
  }
}

type OpTypes = OpTypes.Value

object OpTypes extends Enumeration {
  val Connection = Value("connection")
  val Status = Value("status")
}