将 java 枚举转换为 scala 枚举以进行 json4s 序列化
Convert java enum to scala Enumeration for json4s serialization
我正在使用 json4s 库将 Scala 大小写 classes 转换为 json 消息。我的案例 classes 依赖于第三方 java 枚举类型:
//third party java code
public enum Fruit {
Banana (1),
Cherry (2);
}
我的 scala classes 然后使用这个枚举作为参数:
case class Order(fruit : Fruit, quantity : Int)
我正在尝试 use 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)
}
但是,我遇到了编译时错误:
error: inferred type arguments [Fruit] do not conform to class
EnumNameSerializer's type parameter bounds [E <: Enumeration]
如何将 java 枚举转换为 json4s' EnumNameSerializer 的 Scala 枚举?
我希望避免写 custom serializer 因为我的实际用例涉及许多不同的 java 枚举类型 class 因此我必须写很多不同的自定义序列化器。
提前感谢您的考虑和回复。
这样的事情对你有用吗?
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)
此功能现在 out-of-the-box,您可以这样使用它:
implicit val formats: Formats =
DefaultFormats + new JavaEnumNameSerializer[Fruit]()
它在@Giovanni-s 回答和我对图书馆的 PR 后合并到那里。
我正在使用 json4s 库将 Scala 大小写 classes 转换为 json 消息。我的案例 classes 依赖于第三方 java 枚举类型:
//third party java code
public enum Fruit {
Banana (1),
Cherry (2);
}
我的 scala classes 然后使用这个枚举作为参数:
case class Order(fruit : Fruit, quantity : Int)
我正在尝试 use 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)
}
但是,我遇到了编译时错误:
error: inferred type arguments [Fruit] do not conform to class EnumNameSerializer's type parameter bounds [E <: Enumeration]
如何将 java 枚举转换为 json4s' EnumNameSerializer 的 Scala 枚举?
我希望避免写 custom serializer 因为我的实际用例涉及许多不同的 java 枚举类型 class 因此我必须写很多不同的自定义序列化器。
提前感谢您的考虑和回复。
这样的事情对你有用吗?
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)
此功能现在 out-of-the-box,您可以这样使用它:
implicit val formats: Formats =
DefaultFormats + new JavaEnumNameSerializer[Fruit]()
它在@Giovanni-s 回答和我对图书馆的 PR 后合并到那里。