[英]How to let json4s or other scala json libs generate Java Collections
[英]Convert java enum to scala Enumeration for json4s serialization
我正在使用json4s库将scala case类转换为json消息。 我的case类依赖于第三方java枚举类型:
//third party java code
public enum Fruit {
Banana (1),
Cherry (2);
}
然后我的scala类使用此枚举作为参数:
case class Order(fruit : Fruit, quantity : Int)
我试图使用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)
}
但是,我得到一个编译时错误:
错误:推断类型参数[Fruit]不符合类EnumNameSerializer的类型参数bounds [E <:Enumeration]
如何将java枚举转换为json4s的EnumNameSerializer的scala Enumeration?
我希望避免编写自定义序列化程序,因为我的实际用例涉及我的case类中使用的许多不同的java枚举类型,因此我将不得不编写许多不同的自定义序列化程序。
提前感谢您的考虑和回应。
这样的事情对你有用吗?
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)
此功能现已开箱即用,您可以像这样使用它:
implicit val formats: Formats =
DefaultFormats + new JavaEnumNameSerializer[Fruit]()
在@ Giovanni的答案和我的PR到图书馆后,它被合并在那里。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.