我有一个使用一堆 Java 代码的 Scala 项目,例如这个 Java 源代码:
public enum Category { FOO, BAR };
然后我有一堆 Scala 案例类,我使用 Argonaut 将它们序列化到 JSON 和从 JSON 序列化,如下所示:
case class Thing (a: String, b: Int, c: Float)
object Thing {
implicit val j = casecodec3 (Thing.apply, Thing.unapply)("a", "b", "c")
implicit val e: Equal[Guild] = Equal.equal (_ == _)
}
很好,现在我想编写一个使用 Java 枚举的 Scala 案例类,如下所示:
case class Thing (a: String, b: Int, c: Float, d: Category)
object Thing {
implicit val j = casecodec4 (Thing.apply, Thing.unapply)("a", "b", "c", "d")
implicit val e: Equal[Guild] = Equal.equal (_ == _)
}
这将产生编译错误,因为 Category 枚举没有隐式编解码器。
我想我可以通过执行以下操作来编写自己的编解码器专门用于处理 Category 枚举:
package object ArgonautImplicits {
implicit val dx: DecodeJson[Category] = StringDecodeJson.map(x => Category.valueOf(x))
implicit val ex: EncodeJson[Category] = EncodeJson(x => jString(x.toString))
}
但我想知道是否有一种方法可以编写一个能够自动处理任何 Java 枚举的编解码器。