简体   繁体   English

将java enum转换为scala Enumeration for json4s serialization

[英]Convert java enum to scala Enumeration for json4s serialization

I'm using the json4s library to convert scala case classes into json messages. 我正在使用json4s库将scala case类转换为json消息。 My case classes are dependent on third party java enum types: 我的case类依赖于第三方java枚举类型:

//third party java code
public enum Fruit {
    Banana (1),
    Cherry (2);
}

My scala classes then use this enum as a parameter: 然后我的scala类使用此枚举作为参数:

case class Order(fruit : Fruit, quantity : Int)

I'm trying to use EnumNameSerializer provided by the `org.json4s.ext' library: 我试图使用EnumNameSerializer由`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)
}

But, I'm getting a compile time error: 但是,我得到一个编译时错误:

error: inferred type arguments [Fruit] do not conform to class EnumNameSerializer's type parameter bounds [E <: Enumeration] 错误:推断类型参数[Fruit]不符合类EnumNameSerializer的类型参数bounds [E <:Enumeration]

How do I convert a java enum into a scala Enumeration for json4s' EnumNameSerializer? 如何将java枚举转换为json4s的EnumNameSerializer的scala Enumeration?

I'm hoping to avoid writing a custom serializer since my actual use case involves many different java enum types used in my case class and therefore I would have to write many different custom serializers. 我希望避免编写自定义序列化程序,因为我的实际用例涉及我的case类中使用的许多不同的java枚举类型,因此我将不得不编写许多不同的自定义序列化程序。

Thank you in advance for your consideration and response. 提前感谢您的考虑和回应。

Would something like this work for you? 这样的事情对你有用吗?

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)

This functionality is out-of-the-box now, you can use it like this: 此功能现已开箱即用,您可以像这样使用它:

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

It was merged there following @Giovanni-s answer and my PR to the library. 在@ Giovanni的答案和我的PR到图书馆后,它被合并在那里。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM