如何为具有多个apply方法的案例类定义Json格式?

时间:2016-09-07 20:57:33

标签: json scala spray

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

但是有一个问题我无法在StackOverflow或其他地方找到答案。如果您有一个具有明确定义的对象的案例类,并且至少定义了一个 apply 方法,该怎么办?

例如,让我们说我们的case类被称为RuleSet并且因此被定义(带有一些不重要的附加方法签名):

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

因此定义了对象:

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

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

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

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

要做什么?

好吧,我确实找到了一个解决方案,并将其作为我自己问题的答案发布在此处,以便其他人可以节省自己花时间来解决问题。

1 个答案:

答案 0 :(得分:0)

解决方案是通过吸引编译器的类型推理来创建一个变量,它是apply方法的显式签名:

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

您需要做的就是:只需明确指出您要使用的方法。