Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.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
将java枚举转换为scala枚举以进行json4s序列化_Java_Scala_Json4s - Fatal编程技术网

将java枚举转换为scala枚举以进行json4s序列化

将java枚举转换为scala枚举以进行json4s序列化,java,scala,json4s,Java,Scala,Json4s,我正在使用该库将scala案例类转换为json消息。我的案例类依赖于第三方java枚举类型: //third party java code public enum Fruit { Banana (1), Cherry (2); } 然后,我的scala类将此枚举用作参数: case class Order(fruit : Fruit, quantity : Int) 我试图通过org.json4s.ext库提供: import org.json4s._ import org

我正在使用该库将scala案例类转换为json消息。我的案例类依赖于第三方java枚举类型:

//third party java code
public enum Fruit {
    Banana (1),
    Cherry (2);
}
然后,我的scala类将此枚举用作参数:

case class Order(fruit : Fruit, quantity : Int)
我试图通过org.json4s.ext库提供:

import org.json4s._
import org.json4s.native.Serialization
import org.json4s.native.Serialization.{write, read}
import org.json4s.ext.EnumNameSerializer

case class Order(fruit : Fruit, quantity : Int) {
  implicit lazy val formats =
    DefaultFormats + new EnumNameSerializer(fruit)
}
但是,我得到了一个编译时错误:

错误:推断的类型参数[Fruit]不符合类
EnumNameSerializer的类型参数边界[E是否需要此功能

class EnumSerializer[E <: Enum[E]](implicit ct: Manifest[E]) extends CustomSerializer[E](format ⇒ ({
  case JString(name) ⇒ Enum.valueOf(ct.runtimeClass.asInstanceOf[Class[E]], name)
}, {
  case dt: E ⇒ JString(dt.name())
}))



// first enum I could find
case class X(a: String, enum: java.time.format.FormatStyle)
implicit val formats = DefaultFormats + new EnumSerializer[java.time.format.FormatStyle]()

// {"a":"test","enum":"FULL"}
val jsonString = Serialization.write(X("test", FormatStyle.FULL))
Serialization.read[X](jsonString)

class EnumSerializer[E此功能现在是现成的,您可以这样使用它:

implicit val formats: Formats =
  DefaultFormats + new JavaEnumNameSerializer[Fruit]()

在@Giovanni-s的回答和我对库的PR之后,它被合并到了那里。

为什么不为您的枚举编写一个自定义序列化程序呢?您只编写它once@TrustNoOne正如我在问题中所写的,这些是第三方枚举,其中有很多。哦,对不起,你写了“许多不同的枚举值”我还以为你只有一个枚举和很多枚举values@TrustNoOne我更新了您提到的令人困惑的部分。谢谢。您可以使用Enum.valueOf(class,name)创建一个通用序列化程序,看看我的答案;)