Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.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
Scala json4s密封特性作为枚举_Scala_Enums_Traits_Json4s_Sealed - Fatal编程技术网

Scala json4s密封特性作为枚举

Scala json4s密封特性作为枚举,scala,enums,traits,json4s,sealed,Scala,Enums,Traits,Json4s,Sealed,我们的状态定义为: sealed trait Status case object Status { case object StatusA extends Status case object StatusB extends Status case object StatusC extends Status } 我们的状况如下: val status = Status.StatusA 有没有办法用预定义的json4sfomratters(反)序列化这种结构 我们尝试使用defu

我们的状态定义为:

sealed trait Status
case object Status {
  case object StatusA extends Status
  case object StatusB extends Status
  case object StatusC extends Status
}
我们的状况如下:

val status = Status.StatusA
有没有办法用预定义的
json4s
fomratters(反)序列化这种结构

我们尝试使用defult formatter,如:

implicit val formats = new org.json4s.DefaultFormats
但它没有起作用。接下来,我们尝试使用
json4s
提供的
ext
和Enum支持:

implicit val formats = org.json4s.DefaultFormats + new org.json4s.ext.EnumSerializer(Status)

但它没有再次起作用。我们必须将
密封特征
的结构完全改变为实际的
枚举
s。有没有办法用
case class
es来实现这一点?

这是一个完整的工作示例,我对您的类做了一些更改,以使示例更简单,这样您就可以以不同的方式使用“name”,您实际上可以省略“def name”,但在这种情况下,您需要稍微更改serialiser。第二个序列化程序就在下面



    sealed trait Status {
      def name: String
    }

    case object Status {
      def apply(name: String): Status = name match {
        case StatusA.name => StatusA
        case StatusB.name => StatusB
        case StatusC.name => StatusC
        case _ => throw new UnsupportedOperationException("Unknown value")
      }
    }

    case object StatusA extends Status {
      override val name = "StatusA"
    }

    case object StatusB extends Status {
      override val name = "StatusB"
    }

    case object StatusC extends Status {
      override val name = "StatusC"
    }

    class StatusSerializer extends CustomSerializer[Status](formats =>
      ( {
        case JString(s) => Status(s)
        case JNull => throw new UnsupportedOperationException("No status specified")
      }, {
        case status: Status => JString(status.name)
      })
    )

    case class SimpleRichObject(someString: String, someInt: Int, statuses: List[Status])

    object Test extends App {
      implicit val formats = DefaultFormats + new StatusSerializer
      val obj = SimpleRichObject("Answer to life the universe and everything", 42, List(StatusA, StatusB, StatusC))

      def toCompactJsonString(any: Any) = {
        JsonMethods.compact(JsonMethods.render(Extraction.decompose(any)))
      }

      def toPrettyJsonString(any: Any) = {
        JsonMethods.pretty(JsonMethods.render(Extraction.decompose(any)))
      }

      /** To Json */
      println(s"Compact json:\n${toCompactJsonString(obj)}")
      println(s"Pretty json:\n${toPrettyJsonString(obj)}")

      /** From Json */
      val json =
        """{
          |  "someString":"Here is a another String",
          |  "someInt":1234,
          |  "statuses":["StatusA","StatusB"]
          |}""".stripMargin

      val richObj = JsonMethods.parse(json).extract[SimpleRichObject]
      println(s"Rich object toString: $richObj")
    }

这是第二个序列化程序,通过使用第二个序列化程序,您不需要在“枚举”中定义额外的代码

这是一个运行时的外观,压缩json:

{"someString":"Answer to life the universe and everything","someInt":42,"statuses":["StatusA","StatusB","StatusC"]}
漂亮的json:

{
  "someString":"Answer to life the universe and everything",
  "someInt":42,
  "statuses":["StatusA","StatusB","StatusC"]
}
富对象toString:SimpleRichObject(这里是另一个字符串,1234,列表(StatusA,StatusB))

{
  "someString":"Answer to life the universe and everything",
  "someInt":42,
  "statuses":["StatusA","StatusB","StatusC"]
}