如何使用多个应用方法为案例 class 定义 Json 格式?

How do I define Json format for a case class with more than one apply method?

Scala 和 spray-json 一起使定义如何序列化和反序列化 case classes 的实例变得非常容易。 [毫无疑问,其他 Json 库同样易于使用。]

但是有一个问题我无法在 Whosebug 上或其他地方找到答案。如果你有一个案例 class,它有一个明确定义的对象,这样至少定义了一个额外的 apply 方法?

例如,假设我们的案例 class 被称为 RuleSet 并且是这样定义的(带有一些不重要的附加方法签名):

case class RuleSet(rules: Map[String, Rule[String]])

对象是这样定义的:

object RuleSet {
  def apply(): RuleSet = apply(Map[String, Rule[String]]())
  // ... other method definitions ...
}

假设我们在规则范围内有一个隐式 Json 格式,我们应该能够为规则集定义一个 Json 协议,如下所示:

import spray.json._
object RuleProtocol extends DefaultJsonProtocol {
  implicit val ruleSetFormat = jsonFormat1(RuleSet.apply)
}

不幸的是,这给出了一个错误:Error(213,54) 对重载定义的不明确引用...

要做什么?

好吧,我确实想出了一个解决方案,并将 post 在这里作为我自己问题的答案,以便其他人可以节省自己解决问题的时间。

解决方案是通过调用编译器的类型推断来创建一个变量,该变量是 apply 方法的显式签名:

object RuleProtocol extends DefaultJsonProtocol {
  val ruleSetApply: (Map[String,Rule[String]]=>RuleSet) = RuleSet.apply
  implicit val ruleSetFormat = jsonFormat1(ruleSetApply)
}

这就是您需要做的所有事情:只需明确说明您想使用哪种应用方法即可。