java - 将 java enum 转换为 scala Enumeration 以进行 json4s 序列化

标签 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)

我正在尝试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 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)

关于java - 将 java enum 转换为 scala Enumeration 以进行 json4s 序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35847377/

相关文章:

Java 对 MDM^R01 类型的支持

scala - Function1 和 Reader Monad 之间的关系

scala - 在 Akka Typed 中向父actor发送消息

scala - 如何将 json4s JValue 转换为 Jackson JsonNode?

scala - 我如何在 play.api.libs.json.JsValue 和 org.json4s.JValue 之间转换

json - 使用 JSON4S 在重复节点上合并/组合 JSON

java - 如何在不使用 Jackson Api 的情况下在 Java 中将字符串转换为列表<String>

Java 奇怪的引用行为?

java - 如何将 String 对象转换为 String[]?

Scala 2.8 与 2.9 基准测试,奇怪的结果