将java enum转换为scala Enumeration for json4s serialization

时间:2016-03-07 15:19:51

标签: java scala json4s

我使用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'提供use EnumNameSerializer。库:

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&lt ;:Enumeration]

如何将java枚举转换为json4s的scala Enumeration' EnumNameSerializer?

我希望避免编写custom serializer,因为我的实际用例涉及我的case类中使用的许多不同的java枚举类型,因此我必须编写许多不同的自定义序列化器。

提前感谢您的考虑和回应。

2 个答案:

答案 0 :(得分:7)

这样的事情对你有用吗?

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)

答案 1 :(得分:1)

此功能是现成的,您可以像这样使用它:

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

它是根据@ Giovanni-s的答案和我对图书馆的PR合并到那里的。