如何使用多个应用方法为案例 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)
}
这就是您需要做的所有事情:只需明确说明您想使用哪种应用方法即可。
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)
}
这就是您需要做的所有事情:只需明确说明您想使用哪种应用方法即可。