伴随对象、隐式和 Json

Companion objects, implicits, and Json

我在为我也有 Json 格式的类型添加隐式定义的类型转换器时遇到问题。我怀疑问题是否与 Json (或 Spray)有关。或者 MyDate 就此而言。

这是导致我遇到的问题的代码片段:

case class MyDate(y: Int, m: Int, d: Int)
object JsonProblem extends App {
import spray.json.{DefaultJsonProtocol, _}
object MyJsonProtocol extends DefaultJsonProtocol with NullOptions {
  implicit val myDateFormat = jsonFormat3(MyDate)
}
import MyJsonProtocol._
val exampleDate = """{ "y": 2016, "m": 7, "d": 11 }"""
val y: MyDate = exampleDate.parseJson.convertTo[MyDate]
}

到目前为止,一切都按预期进行。值 y 采用 MyDate.

的适当实例

现在,在 case class 定义之后(尽管我认为将这段代码放在哪里并不重要),我引入了一个伴生对象:

object MyDate {
  implicit def convertMyDateToInt(x: MyDate): Int = ???
}

我立即在 myDateFormat 行收到编译器错误:*无法解析具有此类签名的引用 jsonFormat3*。我的附加代码的目的与 Json 解析无关(从我的角度来看)。这是因为在代码的其他部分我想将 MyDate 隐式转换为 Int.

我希望这与我用自己的对象替换(或增强)编译器生成的伴生对象有关。但问题到底是什么,我该如何解决?

只需使用伴生对象应用函数

import spray.json._

case class MyDate(y: Int, m: Int, d: Int)

object MyDate {
  implicit def convertMyDateToInt(x: MyDate): Int = ???
}

object JsonProblem extends App {
  object MyJsonProtocol extends DefaultJsonProtocol with NullOptions {
    implicit val myDateFormat:RootJsonFormat[MyDate] = jsonFormat3(MyDate.apply)
  }
  import MyJsonProtocol._
  val exampleDate = """{ "y": 2016, "m": 7, "d": 11 }"""
  val y: MyDate = exampleDate.parseJson.convertTo[MyDate]
}