2016-03-07 131 views
1

我使用json4s库将scala case类转换为json消息。我的case类是依赖于第三方的Java枚举类型:将java枚举转换为scala枚举json4s序列化

//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枚举转换为一个scala Enumeration for json4s的EnumNameSerializer?

我希望避免编写一个custom serializer,因为我的实际用例涉及我的case类中使用的许多不同的java枚举类型,因此我将不得不编写许多不同的自定义序列化器。

预先感谢您的关怀和响应。

+0

为什么不为您的枚举编写自定义序列化程序?你只写一次 –

+0

@TrustNoOne正如我在问题中写的那样,这些是第三方枚举,并且有很多。 –

+0

对不起,你写了“许多不同的枚举值”,我认为你只有一个枚举值很多 –

回答

6

会是这样的工作吗?

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) 
+0

像魅力一样工作。谢谢。 –