繁体   English   中英

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

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

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

但是有一个问题,在这里我无法在StackOverflow或其他地方找到答案。 如果您有一个带有明确定义的对象的case类,那么至少定义了一个附加的apply方法怎么办?

例如,假设我们的案例类称为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)
}

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

怎么办?

好吧,我确实找到了解决方案,并将其发布在这里,作为对我自己问题的回答,以便其他人可以节省自己解决我的时间。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM