首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将java枚举转换为scala枚举以进行json4s序列化

将java枚举转换为scala枚举以进行json4s序列化
EN

Stack Overflow用户
提问于 2016-03-07 15:19:51
回答 2查看 2.1K关注 0票数 2

我使用json4s库将scala案例类转换为json消息。我的案例类依赖于第三方java枚举类型:

代码语言:javascript
复制
//third party java code
public enum Fruit {
    Banana (1),
    Cherry (2);
}

然后,我的scala类使用这个枚举作为参数:

代码语言:javascript
复制
case class Order(fruit : Fruit, quantity : Int)

我正在尝试EnumNameSerializer由`org.json4s.ext的库提供:

代码语言:javascript
复制
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)
}

但是,我得到了一个编译时错误:

错误:推断类型参数果树不符合类EnumNameSerializer的类型参数界限E <:枚举

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

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

预先感谢您的考虑和答复。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-03-07 17:29:41

像这样的东西对你有用吗?

代码语言:javascript
复制
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)
票数 7
EN

Stack Overflow用户

发布于 2019-06-04 09:19:21

这个功能现在已经开箱即用,您可以这样使用它:

代码语言:javascript
复制
implicit val formats: Formats =
  DefaultFormats + new JavaEnumNameSerializer[Fruit]()

它是在@Giovanni的回答和我对图书馆的公关之后合并的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35847377

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档