簡體   English   中英

將java enum轉換為scala Enumeration for json4s serialization

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM