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)对重载定义的模糊引用......
要做什么?
好吧,我确实找到了一个解决方案,并将其作为我自己问题的答案发布在此处,以便其他人可以节省自己花时间来解决问题。
答案 0 :(得分:0)
解决方案是通过吸引编译器的类型推理来创建一个变量,它是apply方法的显式签名:
object RuleProtocol extends DefaultJsonProtocol {
val ruleSetApply: (Map[String,Rule[String]]=>RuleSet) = RuleSet.apply
implicit val ruleSetFormat = jsonFormat1(ruleSetApply)
}
您需要做的就是:只需明确指出您要使用的方法。